Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待每个过程完成_Javascript_Web Worker - Fatal编程技术网

Javascript 等待每个过程完成

Javascript 等待每个过程完成,javascript,web-worker,Javascript,Web Worker,我正在开发一个在web浏览器中运行的Javascript模拟器。它有一个主回路: do { updateVisualization(simulator); simulator.doStep(); } while (!reachedGoal(simulator)); 对于每个迭代,我都需要运行几个必须同时执行的worker: doStep = function() { ... for (every agent in the simulation) {

我正在开发一个在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
}
我的问题是:我怎么能等每个工人都完成呢?

一个建议:

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
    }
};
doStep=函数(){
var i,工人;
更新可视化(模拟器);
simulator.workers=[];//此步骤的worker数组
对于(i=0;i
因此,所有操作都发生在worker的
onmessage
回调中。每次工作人员响应消息时,您都会检查
模拟器.workers
数组,检查是否所有工作人员的
finished
属性都设置为
true
。如果是这样的话,这意味着所有的工人都完成了,你可以继续前进(“活下来的循环”部分)


所以基本上,你实例化所有的工作人员,然后等待他们的响应。。。不需要循环。

web工作者的想法是让他们在后台执行,而不是让处理程序(=回调)在完成时执行。有一个while循环(它会阻塞UI)会破坏web工作者的整个目的……您是否为每个迭代创建了一组新的工作者?你不能在所有迭代中重复使用同一组worker吗?我正在将模拟器从C#迁移到Javascript,因此它可能会有很大的改进。我将尝试重新使用worker,我仍在考虑如何删除阻止UI的while循环。谢谢,很好,安维瑟。了解如何使用回调和避免while循环会有很大帮助。我希望我能投两次票。@Guido Cool
:)
。我添加了一个文本解释,以防其他人不完全理解代码。