代码之家  ›  专栏  ›  技术社区  ›  sbmthakur

等待已经实现的承诺的性能开销是多少?

  •  6
  • sbmthakur  · 技术社区  · 7 年前

    在进行代码审查时,我最近遇到了这样的代码块:

    const promises = [];
    const data = [];
    for (let piece of pieces) {
      for (let chunk of piece) {
        promises.push(execute(chunk)); //execute returns a promise which is not yet fulfilled
      }
      data = await Promise.all(promises);
    }
    

    pieces 不能 await 一口咬定 因此,这种分块。

    在我的反馈中,我写道,这似乎是一种反模式,因为我们也在等待承诺 在以前的迭代中解决了这些问题

    const data = [];
    for (let piece of pieces) {
      const promises = [];
      for (let chunk of piece) {
        promies.push(execute(chunk)); //execute returns a promise which is not yet fulfilled
      }
      data.push(... await Promise.all(promises));
    }
    

    最后, data 在这两种情况下都是一样的。

    我知道怎么做 在这两种情况下都在填充。我想知道等待已经实现的承诺(发生在第一个代码块中)的性能开销有多大,它是否重要?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bergi    7 年前

    开销很小-它需要迭代已经实现的承诺,检查它,取出数据并将其放入结果数组中。假设本机承诺,我希望这会得到优化,并且不需要往返到事件循环,如果阵列中有这些表,那么所有这些表都需要解析为一个承诺,并且需要异步等待该承诺,从而对承诺作业队列造成损失。

    处理时间上的开销与在您的系统中完成的实际异步工作相比不会太大 execute 功能。

    但是,无论开销有多小,代码的第一个版本的问题在于其运行时复杂性是二次的: Promise.all 需要迭代整个过程 promises