等待一组工人完成

等待一组工人完成

问题描述:

我有一个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();