2016-06-20 49 views
2

我很努力地想到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是「時鐘計時器」。推測這在需要簡單時鐘的應用中很有用。

+2

我不同意那個函數是'setInterval'的一個「危險」;它是一個特定的功能,並且在您希望您的回調在特定時間表上執行的情況下非常有用,該時間表與回調執行的時間無關。 – Hamms

+0

單線程,它不是獨立的,但我明白你的觀點。「 – Ben

+1

」是因爲它只是在分配的時間間隔內完成回調。 ---這不完全正確。最多隻有一個額外的電話正在排隊。 'setInterval'的好處是你不需要手動管理下一個調用(否則你通過設置'setTimeout'來破壞你的域特定的代碼)。並不是說它並不總是一個匿名函數,你可以很容易地通過一個變量來引用函數。 – zerkms

回答

1

適合setTnterval的用例是當您想要在某個確切時間執行某個功能時。 setIntervalsetTimeout有小標題的區別。 setInterval從先前的setInterval開火後的延遲開始執行。 setInterval也不隱遁,所以不用擔心關閉和內存泄漏。更多的細節可以然而被發現here

下面是一個典型的setInterval函數的代碼

var intervalID = window.setInterval(myCallback, 500); 

function myCallback() { 
    // Your code here 
} 

凡爲使用的setTimeout來實現同樣的功能,你必須創建一個遞歸可創建閉合,然後內存泄漏問題如下所示。

function startTimer() { 
    var count = [1,2,3,4,5,6,7,8,9,0] 
    setTimeout(function() { 
     //do some stuff 
     count.push(100);//you have just create a closure 
     //and all the problems that is associated with it 
     startTimer();//this is where the recursion happens 
    }, 1000); 
} 
+0

我在想同樣的答案,但後來我看了Ben的個人資料,他有11k的聲望,他是一個Javascript顧問,他在Medium上寫了很多javascript文章,並且意識到他可能正在尋找更實用的答案:)等等!什麼?我不是一個纏擾者...... –

+1

好的謝謝你的提示讓我包括一些代碼,以更好地說明我的答案 – spirit

相關問題