2017-06-29 50 views
0

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

我不想讓工人來調用一個單獨的功能一旦最後一名工人完成。有什麼辦法可以做到這一點?

回答

1

你想要做的是創建承諾,並在承諾的功能內部,啓動所有工作人員,並檢查何時最後結束調用承諾的解決功能,並在激活中返回此承諾功能。

會是這樣的:

// 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; 
} 

的代碼沒有被現在測試,但希望你的想法。要做到這一點

1

一種方式是承諾包一切,

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