在編寫JavaScript代碼時,您可能需要延遲函數的執行。了解如何使用setTimeout和setInterval在未來安排函數的執行。
setTimeout()
在編寫JavaScript代碼時,您可能需要延遲函數的執行。
這就是setTimeout
的工作。您指定一個將要延遲執行的回調函數,以及以毫秒表示的延遲時間:
setTimeout(() => {
// 2秒後執行
}, 2000)
setTimeout(() => {
// 50毫秒後執行
}, 50)
這個語法定義了一個新函數。您可以在其中調用任何其他函數,或者可以傳遞一個現有的函數名稱和一組參數:
const myFunction = (firstParam, secondParam) => {
// 做些事情
}
// 2秒後執行
setTimeout(myFunction, 2000, firstParam, secondParam)
setTimeout
返回計時器id。這通常不會使用,但您可以存儲這個id,如果要刪除該計劃的函數執行,則可以清除它:
const id = setTimeout(() => {
// 應該在2秒後執行
}, 2000)
// 我改變了主意
clearTimeout(id)
零延遲
如果將延遲時間設置為0
,則回調函數將盡快執行,但在當前函數執行之後執行:
setTimeout(() => {
console.log('after ')
}, 0)
console.log(' before ')
將打印before after
。
這對於避免在密集任務上阻塞CPU並在執行繁重計算時讓其他函數執行非常有用,通過在調度程序中對函數進行排隊。
某些瀏覽器(IE和Edge)實現了一個
setImmediate()
方法,具有完全相同的功能,但它不是標準的,並且在其他瀏覽器上不可用。但它是Node.js中的標準函數。
setInterval()
setInterval
是一個與setTimeout
類似的函數,但有一個區別:它不僅運行一次回調函數,而是以您指定的特定時間間隔(以毫秒為單位)無限次運行:
setInterval(() => {
// 每2秒運行一次
}, 2000)
上面的函數每2秒運行一次,除非您使用clearInterval
告訴它停止運行,並將其傳遞給setInterval
返回的間隔id:
const id = setInterval(() => {
// 每2秒運行一次
}, 2000)
clearInterval(id)
通常在setInterval回調函數內部調用clearInterval
,讓它自動判定是否應該再次運行或停止運行。例如,此代碼運行某些內容,除非App.somethingIWait的值為arrived
:
const interval = setInterval(() => {
if (App.somethingIWait === 'arrived') {
clearInterval(interval)
return
}
// 否則執行一些操作
}, 100)
遞迴setTimeout
setInterval
每n毫秒開始一個函數,並不考慮函數是否完成執行。
如果函數始終需要相同的時間,就沒有問題:
也許該函數的執行時間不同,取決於網絡狀況,例如:
也許一個長時間的執行與下一個執行重疊:
為了避免這種情況,您可以安排一個遞迴setTimeout在回調函數完成時調用:
const myFunction = () => {
// 做些事情
setTimeout(myFunction, 1000)
}
setTimeout(
myFunction()
}, 1000)
實現這種情況:
setTimeout
和setInterval
在Node.js中可用,通過Timers模塊提供。
Node.js還提供了setImmediate()
,它等同於使用setTimeout(() => {}, 0)
,主要用於與Node.js事件循環一起使用。