跳至主要内容

如何讓 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 廣告