一个旧专案的需求,原来的程式码长这样,每十分钟会执行 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
测试可用符合需求,问题解决