跳到主要内容

如何让 JS 的 setInterval 立即执行

· 2 分钟阅读
Eric Cheng

一个旧专案的需求,原来的程式码长这样,每十分钟会执行 doSomething 这个 function,但是这个程式码第一次执行会发生在十分钟后,而使用者希望第一次执行能立即执行

function doSomething() {
...
}

setInterval(doSomething, 600000); // 十分钟

其实最直觉的做法就是在 setInterval 之前先直接执行一次,像

function doSomething() {
...
}

doSomething(); // 新增执行一次
setInterval(doSomething, 600000); // 十分钟

这种写法存在一个问题,如果执行绪执行的时间过久的话,可能会造成同时执行多个执行绪

怎么说?这个范例实务上不会有这种情形,因为时间是十分钟,而 doSomething 这个 function 实际小于十分钟,但如果设定的时间较短,有可能会在第一个 doSomething 还没执行完,第两个就跑起来了,这时你就必须评估两个 doSomething 同时执行会不会对系统造成影响

查询了一下 JS 语法,比较合理的写法应该是

function doSomething() {
...
return doSomething;
}

var timer;
timer && clearInterval(timer);
timer = setInterval(doSomething(), 600000);

注意,原来的 setInterval(doSomething, 600000) 中,doSomething 是没有小括号的,代表回传的只是 function,而修改后的 setInterval(doSomething(), 600000)有小括号,代表会直接先执行,再回传 return 的 function

测试可用符合需求,问题解决

版权声明


這是 google 廣告