JavaScript基于計時器的偽線程機制

來源: RockUX  發布時間: 2011-03-20 20:36  閱讀: 1760 次  推薦: 0   原文鏈接   [收藏]  
摘要:在之前的那篇瀏覽器對Javascript代碼執行的限制文章中,描述了5個瀏覽器在javascript代碼執行的時間過長的時候怎么辦。它不會改變瀏覽器的行為,也不可能取消掉后端服務器的進程。不過,計時器可以幫助我們實現長期運行的任務而不需要阻塞瀏覽器。

  在之前的那篇瀏覽器對Javascript代碼執行的限制文章中,描述了5個瀏覽器在javascript代碼執行的時間過長的時候怎么辦。它不會改變瀏覽器的行為,也不可能取消掉后端服務器的進程。不過,計時器可以幫助我們實現長期運行的任務而不需要阻塞瀏覽器。

  什么是計時器

  JavaScript代碼中,每一個函數都可以設定在某一個時刻之后執行:

  • setTimeout(function,msec[,arg1...argN]),會在多少毫秒之后運行這個函數。后面的參數會傳遞給要執行的函數。
  • setInterval(function,msec[,arg1...argN]),與setTimeout類似,只不過是每這么多毫秒執行一次。

  還有兩個方法,clearTimeout()和 clearInterval(),可以清除計時器。

 
var timerID = setTimeout(myfunction,500);
clearTimeout(timerID);

  需要注意的是:

  • setTimeout和setInteral會給函數傳遞一個引用。setTimeout(myfunction(),500)這樣的代碼會立即執行這個函數。
  • 毫秒數不會那么的精確。他只會在瀏覽器進程空閑的時候才會比較準確的按時間執行。
  • 不要過于依賴這樣的執行順序:setTimeout(f1,50),setTimeout(f2,50),有可能f2()會先執行。

  基于計時器的執行

  定時的代碼不會立即執行,這樣瀏覽器在這期間還能做一些別的事情。因此我們也可以將一個長的任務分成好幾個部分來執行。

  舉一個簡單的餓例子,加入我們想按照順序執行f1(),f2(),f3():

 
function ProcessThread(func) {
var ms = 20;
setTimeout(
function() {
func.shift()();

if (func) {
setTimeout(arguments.callee, ms);
}
}, ms);
}
ProcessThread([f1, f2, f3]);

  func.shift()()是什么?

  這里需要解釋一下:func.shift()會移除數組中的第一個元素然后返回這個元素。這里返回的就是個函數,所以我們再用一個括號來執行它。它跟var f = func.shift(); f()是一樣的。

  ProcessThread會依次運行傳遞進來的所有函數,但是會相隔20ms。無論多少個函數,都會按次序執行,假設沒有哪個程序會跑出”unresponsive script”錯誤。

  當然,這種方法對于處理大型數據的時候會比較有用。

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()