有一种方法可以配置javascript的setInterval方法来立即执行该方法,然后与计时器一起执行
当前回答
如果你可以使用RxJS,有一个叫做timer()的东西:
import { Subscription, timer } from 'rxjs';
const INITIAL_DELAY = 1;
const INTERVAL_DELAY = 10000;
const timerSubscription = timer(INITIAL_DELAY, INTERVAL_DELAY)
.subscribe(() => {
this.updateSomething();
});
// when destroying
timerSubscription.unsubscribe();
其他回答
函数的即时异步调用存在一个问题,因为标准的setTimeout/setInterval即使直接将其设置为0,也具有大约几毫秒的最小超时。这是由浏览器特定的工作引起的。
一个具有REAL零延迟的代码示例,可在Chrome, Safari, Opera中工作
function setZeroTimeout(callback) {
var channel = new MessageChannel();
channel.port1.onmessage = callback;
channel.port2.postMessage('');
}
你可以在这里找到更多信息
在第一次手动调用之后,您可以用函数创建一个间隔。
你可以在函数中设置一个非常小的初始延迟时间(例如100),并将其设置为你想要的延迟时间:
Var延迟= 100; 函数foo() { console.log("改变初始延迟时间为你想要的。"); 延迟= 12000; setTimeout (foo,延迟); }
在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));
}
})();
这里有一个简单的版本给新手,没有所有的混乱。它只是声明函数,调用它,然后开始interval。就是这样。
//在这里声明函数 函数My_Function () { console.log (" foo "); } //首先调用函数 My_Function (); //设置时间间隔 Var interval =窗口。setInterval(My_Function, 500);
如果你需要,这里有一个包装来美化它:
(function() {
var originalSetInterval = window.setInterval;
window.setInterval = function(fn, delay, runImmediately) {
if(runImmediately) fn();
return originalSetInterval(fn, delay);
};
})();
将setInterval的第三个参数设置为true,它将在调用setInterval后立即运行:
setInterval(function() { console.log("hello world"); }, 5000, true);
或者省略第三个参数,它将保持原来的行为:
setInterval(function() { console.log("hello world"); }, 5000);
一些浏览器支持setInterval的附加参数,但这个包装器没有考虑到这些参数;我认为这些很少使用,但如果你确实需要它们,请记住这一点。