Ну, вот другой способ приблизиться к нему:
function multiplyAndSum(a1, a2){
let ret = 0;
for(let i = 0, l = a1.length; i < l; i++){
ret += a1[i]*a2[i];
}
return ret;
}
function getWorkerMessage(worker) {
return new Promise((resolve, reject) => {
worker.onmessage(event => {
resolve(event);
});
});
}
function getProcessedData(){
const worker1 = new Worker('recordProcessor.js');
const worker2 = new Worker('recordprocessor.js');
let p = Promise.all([
getWorkerMessage(worker1),
getWorkerMessage(worker2)
]).then([a1, a2] => {
return multiplyAndSum(a1.results, a2.results);
});
// start off both workers by sending them their data
fetch('./dataSet1.json')
.then(rep=>resp.json())
.then(d=>worker1.postMessage({'set': 1,'data': d}));
fetch('./dataSet2.json')
.then(rep=>resp.json())
.then(d=>worker2.postMessage({'set': 1,'data': d}));
return p;
}
// usage
getProcessedData().then(result => {
console.log(result);
}).catch(err => {
console.log(err);
});
Вот мое понимание того, что вы пытаетесь сделать.
- Создайте двух рабочих
- Извлечение двух наборов данных и передача одного набора данных каждому работнику
- Когда у вас есть обработанные данные от обоих работников, умножьте два полученных массива вместе и суммируйте продукты, чтобы создать одно конечное значение
- Затем вызывающий объект хочет получить это окончательное значение
Итак, мой предложенный код использует превращает рабочее сообщение в операцию, которая возвращает обещание, которое разрешается в результате этой работы, когда она выполнена.Затем я использую Promise.all()
, чтобы узнать, когда оба работника закончили.В этот момент у вас есть два массива данных, которые можно умножить и суммировать для получения окончательного результата.
Потенциально свободный конец: нужно ли вычистить двух рабочих, когда закончите с ними?