Предложение:
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
.Если это так, это означает, что все работники закончили и вы можете двигаться дальше (часть «выжил для цикла»).
Таким образом, в основном вы создаете экземпляры для всех работников, а затем просто ждете их ответов.. цикл не требуется.