2011-09-09 27 views
2

我正在使用一個運行在Web瀏覽器中的Javascript模擬器。它有一個主循環:等到每個過程結束

do { 
    updateVisualization(simulator); 
    simulator.doStep(); 
} while (!reachedGoal(simulator)); 

而對於每次迭代,我需要運行必須同時執行幾個工人:

​​

我的問題是:我怎麼會等待每個工人完成?

+0

網絡工作者的想法是讓他們在後臺執行,並在處理完成後執行處理程序(=回調)。有一個while循環(阻止用戶界面)擊敗了web工作人員的整個目的...... –

+0

您是否爲每次迭代創建了一組新的工作人員?難道你不能在所有迭代中重複使用同一組工人嗎? –

+0

我正在將模擬器從C#遷移到Javascript,因此可能會改進很多。我會嘗試重新使用這些工作人員,並且我仍在考慮如何刪除阻止用戶界面的while循環。謝謝。 –

回答

4

一個建議:

doStep = function() { 
    var i, worker; 

    updateVisualization(simulator);  

    simulator.workers = []; // array of workers for this step 

    for (i = 0; i < agents.length; i++) { 
     // set up new worker 
     worker = new Worker('worker.js'); 
     worker.onmessage = function (e) { 
      var i; 

      if (e.data === 'finished') { 
       this.finished = true; 

       for (i = 0; i < simulator.workers.length; i++) { 
        if (!simulator.workers[i].finished) { 
         return; 
        } 
       } 

       // survived for-loop = all workers finished 
       if (!reachedGoal(simulator)) { // another iteration? 
        simulator.doStep();  
       } 
      } 
     }; 
     worker.postMessage('doStep'); 

     simulator.workers.push(worker); // push worker into workers array 
    } 
}; 

因此,所有的動作都發生在onmessage回調工人。每次工作人員回覆消息時,都會檢查simulator.workers陣列,方法是檢查是否所有工人的finished屬性設置爲true。如果是這樣的話,這意味着所有的工作人員都完成了,你可以繼續前進(「存活的循環」部分)。

所以基本上,你實例化所有的工人,然後只是等待他們的迴應...沒有循環需要。

+0

偉大的anwser,Šime。它有助於瞭解如何使用回調並避免while循環。我希望我能投票兩次。 –

+0

@Guido Cool':)'。我已經添加了一個文本說明,以防其他人完全不瞭解代碼。 –