Javascript 等待每个过程完成
我正在开发一个在web浏览器中运行的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) {
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
:)
。我添加了一个文本解释,以防其他人不完全理解代码。