一個舊專案的需求,原來的程式碼長這樣,每十分鐘會執行 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
測試可用符合需求,問題解決