等待一组工人完成
问题描述:
我有一个webworkers的数组,名为workers
。我在一个叫做activate
的函数中启动它们。问题是,我想让activate
返回由worker
发布的值。我希望它能够回复某种承诺,或等到它们全部完成。等待一组工人完成
因此,代码可能是:
// the web workers add stuff in this array with onmessage()
var globalArray = [];
function activate(){
for(var i = 0; i < workers.length; i++){
workers[i].postMessage('do something');
}
return // Promise or filled globalArray;
}
所以我可以用这样的:
var values = await activate();
我不想让工人来调用一个单独的功能一旦最后一名工人完成。有什么办法可以做到这一点?
答
你想要做的是创建承诺,并在承诺的功能内部,启动所有工作人员,并检查何时最后结束调用承诺的解决功能,并在激活中返回此承诺功能。
会是这样的:
// the web workers add stuff in this array with onmessage()
var globalArray = [];
function activate(){
var promise = new Promise(function(resolve, reject){
var counter = 0;
var array = [];
var callback = function(message){
counter++;
//You can add here the values of the messages
globalArray.push(message.data);
//Or add them to an array in the function of the Promise
array.push(message.data);
//And when all workers ends, resolve the promise
if(counter >= workers.length){
//We resolve the promise with the array of results.
resolve(array);
}
}
for(var i = 0; i < workers.length; i++){
workers[i].onmessage = callback;
workers[i].postMessage('do something');
}
});
return promise;
}
的代码没有被现在测试,但希望你的想法。要做到这一点
答
一种方式是承诺包一切,
const workers = [ new Worker("./worker1.js"), new Worker("./worker2.js")];
const activate =() => {
return new Promise((resolve,reject) => {
let result = [];
for (let i = 0 ; i < workers.length; i++) {
workers[i].postMessage("do something");
workers[i].onmessage = function(e) {
result.push(e.data);
};
}
resolve(result)
});
};
async function f() {
let res = await activate();
console.log(res);
}
f();