2012-02-09 31 views
11

假設我有setInterval(PostToServer, 1000);PostToServer函數會生成ajax文章,這可能需要一秒以上的時間。那麼接下來會發生什麼:在第一次沒有結束或者在結束新的呼叫之前等待第二個呼叫?javascript setInterval:做調用重疊?

回答

7

通話重疊。

setInterval確保函數定期運行,無需等待以前的結果。

如果要等待響應,請將間隔方法更改爲輪詢器。當時間已過並且服務器已經響應時,再次請求。

由於服務器響應在響應後不會發生太多變化,因此您還可以在AJAX方法的回調函數中添加setTimeout處理程序。

+0

@ jfriend00這個答案是正確的。 OP詢問'setInterval'中的函數是否等待來自前一個'setInterval'方法的AJAX請求的結束,而不是前一個'setInterval'調用中函數的結尾**。 – 2012-02-09 22:19:42

+1

我最初誤讀了這個問題,並收回了我的評論,並且倒下了。我最初以爲他們問是否兩個setInterval回調調用可能重疊(他們不能)。我沒有看到他們在談論關於間隔觸發的ajax調用。 – jfriend00 2012-02-09 22:25:28

8

Javascript是單線程的(除了未涉及此問題的HTML5網絡工作者)和事件隊列。在上一次呼叫完成之前,從setInterval()開始的後續呼叫將永遠不會啓動。一次只能有一個人活躍起來。

當您的時間間隔發生時,JS引擎內部會觸發定時器,並將事件添加到javascript事件隊列中。噹噹前正在運行的JS執行完畢(而不是之前)時,JS引擎會從事件隊列中取出下一個事件並啓動該JS執行的線程。因此,JS中的兩個執行路徑將永遠不會重疊或同時進行。所以,來自setInterval()的兩個函數調用永遠不會重疊。第二個在第一個執行完成之前不會啓動。

但是,相對於你的問題,這意味着從setInterval()的兩個區間永遠不會重疊,但是如果你在第一個間隔定時器上進行異步ajax調用,並且ajax調用的開始馬上結束,第二個時間間隔在第一個異步ajax調用觸發它的完成函數之前觸發,那麼您的ajax調用將會或可能重疊。

如果你想防止一次有多個ajax調用在進行,你必須編寫一些代碼來專門防止這種情況發生,直到前一個ajax調用完成或者只是跳過任何Ajax調用,如果前一個仍在繼續。

請參閱this post瞭解關於JS事件隊列的更多信息以及它如何工作。

1

是的,它重疊。您可以在PostToServer函數中使用setTimeout以確保它不重疊,但問題是它運行請求,然後等待1秒,然後再次運行請求。所以它不會精確地運行。

欲瞭解更多信息,請參閱該視頻保羅愛爾蘭:http://youtu.be/i_qE1iAmjFg?t=7m46s