等待一组工人完成

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();