我想从多个来源获取数据。检索完每个数据集后,我想将其发送到另一个异步处理器(如工作线程)。然后,一旦所有进程完成聚合数据并返回。
例如:
data.frame
我认为我需要将所有这些都包装在另一个Promise中,但是我不确定如何做到这一点。
答案 0 :(得分:2)
好吧,这是另一种处理方式:
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()
来了解两个工作人员何时完成。此时,您可以将两个数据数组相乘并求和以获得最终结果。
可能会松弛:用完两个工人后,您是否必须清理它们?