有一种方法可以配置javascript的setInterval方法来立即执行该方法,然后与计时器一起执行


当前回答

这个例子建立在@Alnitak的回答上,但是使用await Promise在循环循环中进行更细粒度的控制。

比较的例子:

let stillGoing = true;

(function foo() {
    console.log('The quick brown fox did its thing');
    if (stillGoing) setTimeout(foo, 5000);
})();

foo();

在上面的例子中,我们调用foo(),然后它每5秒调用一次自己。

但是如果,在未来的某个时候,我们为了停止循环而将stillGoing设为false,即使在发出停止命令之后,我们仍然会得到一个额外的log行。这是因为在任何给定的时间,在我们将stillGoing设置为false之前,当前迭代将已经创建了一个超时来调用下一次迭代。

如果我们使用await Promise作为延迟机制,那么我们就有机会在调用下一次迭代之前停止循环:

let stillGoing = true;

(async function foo() {
    console.log('The quick brown fox did its thing');
    await new Promise(resolve => setTimeout(resolve, 5000));
    if (stillGoing) foo();
})();

foo();

在第二个示例中,我们首先设置5000ms的延迟,之后检查stillGoing值并决定是否调用另一个递归是合适的。

如果我们在任意点将stillGoing设为false,在我们设置值之后就不会打印出额外的log行。

需要注意的是,这要求函数是异步的,对于给定的使用,这可能是也可能不是一个选项。

其他回答

/ / YCombinator 匿名函数(fnc) { 返回函数(){ fnc。应用(fnc参数); 返回fnc; } } //第一次调用: setInterval(匿名函数(){ console.log(“酒吧”); }) (), 4000); //不调用第一次: setInterval(匿名函数(){ console.log (" foo "); }), 4000); //或者简单: setInterval(函数(){ console.log(“巴兹”); }, 4000);

好吧,这太复杂了,让我说得简单点:

函数hello(status) { console.log(‘世界’,+ + status.count); 返回状态; } setInterval(hello, 5 * 1000, hello({count: 0}));

这个例子建立在@Alnitak的回答上,但是使用await Promise在循环循环中进行更细粒度的控制。

比较的例子:

let stillGoing = true;

(function foo() {
    console.log('The quick brown fox did its thing');
    if (stillGoing) setTimeout(foo, 5000);
})();

foo();

在上面的例子中,我们调用foo(),然后它每5秒调用一次自己。

但是如果,在未来的某个时候,我们为了停止循环而将stillGoing设为false,即使在发出停止命令之后,我们仍然会得到一个额外的log行。这是因为在任何给定的时间,在我们将stillGoing设置为false之前,当前迭代将已经创建了一个超时来调用下一次迭代。

如果我们使用await Promise作为延迟机制,那么我们就有机会在调用下一次迭代之前停止循环:

let stillGoing = true;

(async function foo() {
    console.log('The quick brown fox did its thing');
    await new Promise(resolve => setTimeout(resolve, 5000));
    if (stillGoing) foo();
})();

foo();

在第二个示例中,我们首先设置5000ms的延迟,之后检查stillGoing值并决定是否调用另一个递归是合适的。

如果我们在任意点将stillGoing设为false,在我们设置值之后就不会打印出额外的log行。

需要注意的是,这要求函数是异步的,对于给定的使用,这可能是也可能不是一个选项。

在ES2017中,最好完全避免使用setInterval。

下面的解决方案具有更清晰的执行流程,可以防止函数需要比预期时间更长的时间才能完成的问题,并允许异步操作。

const timeout = (delayMs) => new Promise((res, _rej) => setTimeout(res, delayMs));

const DELAY = 1_000;

(async () => {
  while (true) {
    let start_time = Date.now();

    // insert code here...

    let end_time = Date.now();
    await timeout(DELAY - (end_time - start_time));
  }
})();

我建议按以下顺序调用这些函数

var _timer = setInterval(foo, delay, params);
foo(params)

你也可以把_timer传递给foo,如果你想在特定的条件下清除interval (_timer)

var _timer = setInterval(function() { foo(_timer, params) }, delay);
foo(_timer, params);

为了解决这个问题,我在页面加载后第一次运行这个函数。

function foo(){ ... }

window.onload = function() {
   foo();
};

window.setInterval(function()
{
    foo(); 
}, 5000);