等待一组工人完成
Waiting for a set of workers to finish
我有一个名为 workers
的网络工作者数组。我在一个名为 activate
的函数中启动它们。问题是,我想要 activate
return worker
发布的值。我要么想要 return 某种承诺,要么等到它们全部完成。
所以代码可以是:
// 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();
我不希望工人在最后一个工人完成后调用单独的函数。有什么办法可以实现吗?
你要做的是创建Promise,在Promise的函数里面,启动所有的worker,检查最后一次结束的时间,调用promise的resolve函数,return这个承诺在你的激活函数中。
会是这样的:
// 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();
我有一个名为 workers
的网络工作者数组。我在一个名为 activate
的函数中启动它们。问题是,我想要 activate
return worker
发布的值。我要么想要 return 某种承诺,要么等到它们全部完成。
所以代码可以是:
// 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();
我不希望工人在最后一个工人完成后调用单独的函数。有什么办法可以实现吗?
你要做的是创建Promise,在Promise的函数里面,启动所有的worker,检查最后一次结束的时间,调用promise的resolve函数,return这个承诺在你的激活函数中。
会是这样的:
// 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();