等到每个流程完成

时间:2011-09-09 14:50:12

标签: javascript web-worker

我正在开发一个在Web浏览器中运行的Javascript模拟器。它有一个主循环:

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

对于每次迭代,我都需要运行几个必须同时执行的worker:

doStep = function() {
    ...
    for (every agent in the simulation) {
        var worker = new Worker('worker.js');
        worker.onmessage = function(event) {
            ...
        }
        worker.postMessage(...);
    }

    // Here is the problem
}

我的问题是:我怎么能等待每个工人完成?

1 个答案:

答案 0 :(得分: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数组。如果是这种情况,这意味着所有工人都完成了,你可以继续前进(“幸存的for-loop”部分)。

所以基本上,你实例化所有工人,然后等待他们的回答......不需要循环。