我正在使用一個運行在Web瀏覽器中的Javascript模擬器。它有一個主循環:等到每個過程結束
do {
updateVisualization(simulator);
simulator.doStep();
} while (!reachedGoal(simulator));
而對於每次迭代,我需要運行必須同時執行幾個工人:
我的問題是:我怎麼會等待每個工人完成?
我正在使用一個運行在Web瀏覽器中的Javascript模擬器。它有一個主循環:等到每個過程結束
do {
updateVisualization(simulator);
simulator.doStep();
} while (!reachedGoal(simulator));
而對於每次迭代,我需要運行必須同時執行幾個工人:
我的問題是:我怎麼會等待每個工人完成?
一個建議:
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
。如果是這樣的話,這意味着所有的工作人員都完成了,你可以繼續前進(「存活的循環」部分)。
所以基本上,你實例化所有的工人,然後只是等待他們的迴應...沒有循環需要。
偉大的anwser,Šime。它有助於瞭解如何使用回調並避免while循環。我希望我能投票兩次。 –
@Guido Cool':)'。我已經添加了一個文本說明,以防其他人完全不瞭解代碼。 –
網絡工作者的想法是讓他們在後臺執行,並在處理完成後執行處理程序(=回調)。有一個while循環(阻止用戶界面)擊敗了web工作人員的整個目的...... –
您是否爲每次迭代創建了一組新的工作人員?難道你不能在所有迭代中重複使用同一組工人嗎? –
我正在將模擬器從C#遷移到Javascript,因此可能會改進很多。我會嘗試重新使用這些工作人員,並且我仍在考慮如何刪除阻止用戶界面的while循環。謝謝。 –