我很努力地想到web應用程序開發中的一個用例,需要使用setInterval
。用於使用setTimeout或RAF無法實現的setInterval?
setInterval
的「危險」在於它只是在分配的時間間隔內完成對回調的排隊。
此外,setInterval
的行爲可以用setTimeout
或來模擬,沒有這種「危險」。
鑑於此,有人可以提供一個用例,其中setInterval
是上級/更合適的選項嗎?
編輯:
想我會記下我的發現。
setInterval
是一種簡單的方法,可以在平均間隔內運行某些操作。間隔將主要是相當準確的,但是如果事件循環被阻塞,那麼它們可能完全不準確。
var x = 0;
setInterval(function() {
waitBlocking(5000);
document.write(x++);
},100);
function waitBlocking(ms) {
var start = Date.now();
while((Date.now() - start) < ms) {}
}
據我所知,setInterval
是有用的,如果你想均勻分佈區間回調調用(見上文),但如果你想有特定數量的簡便方法在一段時間內的回調調用,儘可能接近它們應該運行的時間。這似乎是一個相當狹窄的用例。
我確定我錯過了一些東西。
編輯2:
這基本上是一個時鐘JS可以達到最佳的逼近,所以我想setInterval
是「時鐘計時器」。推測這在需要簡單時鐘的應用中很有用。
我不同意那個函數是'setInterval'的一個「危險」;它是一個特定的功能,並且在您希望您的回調在特定時間表上執行的情況下非常有用,該時間表與回調執行的時間無關。 – Hamms
單線程,它不是獨立的,但我明白你的觀點。「 – Ben
」是因爲它只是在分配的時間間隔內完成回調。 ---這不完全正確。最多隻有一個額外的電話正在排隊。 'setInterval'的好處是你不需要手動管理下一個調用(否則你通過設置'setTimeout'來破壞你的域特定的代碼)。並不是說它並不總是一個匿名函數,你可以很容易地通過一個變量來引用函數。 – zerkms