通过多个步骤处理多个承诺

时间:2019-03-06 22:57:44

标签: javascript asynchronous promise

我想从多个来源获取数据。检索完每个数据集后,我想将其发送到另一个异步处理器(如工作线程)。然后,一旦所有进程完成聚合数据并返回。

例如:

data.frame

我认为我需要将所有这些都包装在另一个Promise中,但是我不确定如何做到这一点。

1 个答案:

答案 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);
});

这是我对您要尝试做的事情的理解。

  1. 创建两个工人
  2. 获取两组数据并将一组数据传递给每个工作人员
  3. 当两个工作人员都处理了数据后,将两个结果数组相乘并求和,以得出一个单一的最终值
  4. 呼叫者然后想要那个最终值

因此,我建议的代码使用将工作程序消息转换为一个操作,该操作返回一个承诺,该承诺将在完成后解析为该工作的结果。然后,我使用Promise.all()来了解两个工作人员何时完成。此时,您可以将两个数据数组相乘并求和以获得最终结果。

可能会松弛:用完两个工人后,您是否必须清理它们?