2012-10-27 21 views
1

我有一個耗費DOM(瀏覽器)相關JavaScript過程的資源。啓動時會阻止該頁面(其他DOM相關處理)。是否有可能異步並行運行此進程,並在完成後將結果傳遞給主頁? Web工作者並不是這種情況,因爲流程使用DOM。用於DOM相關處理的JavaScript並行線程

這可以通過iframe實現嗎? JS是否也在iframe塊託管頁面DOM中啓動?

回答

3

其實它是使用WebWorkers的一個主要例子,但正如你所說的,你不會在那裏引用DOM。你唯一的選擇是把這個過程分解成更小的任務。如果你能做到這一點,你需要問自己兩個問題

  • 做小任務需要順序運行?
  • 這些任務可以異步運行嗎?

如果你能回答與沒有這兩個問題,你可以設置一個失控腳本計時器和異步執行這些任務。例如:

var taskList = [ 
    function() {}, 
    function() {}, 
    function() {}, 
    function() {} 
    // a whole lot more entrys 
]; // in a real-world scenario you would `.push()` values or functions 

(function _loop() { 
    setTimeout(function() { 
     var start = Date.now(); 
     do { 
      taskList.shift()(); 
     } while(taskList.length && Date.now() - start < 100) 

     if(taskList.length) setTimeout(_loop, 100); 
    },100); 
}()); 

上面algorythm將執行由taskList儘可能快地包含的功能,但100毫秒最大值的時間範圍內。這將確保瀏覽器UI線程在處理期間不會被阻塞的時間超過100ms。因此,瀏覽器將保持響應

+0

非常感謝你)我會盡力實施你的方法,我相信我可以把這個過程分解成更小的部分。如果成功,將標記爲答案。 – WHITECOLOR

+0

繼承人我寫了一些代碼的鏈接來幫助編寫基於計時器的任務與DOM訪問 - https://github.com/jameswestgate/taskjs –