代码之家  ›  专栏  ›  技术社区  ›  Carlos Muentes

使用承诺使内存处理并发

  •  1
  • Carlos Muentes  · 技术社区  · 6 年前

    我们有一个项目,需要处理约5000个对象,每个对象需要200-500毫秒才能处理。我团队中的一位开发人员建议使用承诺来尝试同时处理每个对象。基本上是这样的:

    let result = await Promise.all(objects.map(o => process(o));
    

    这个 process() 代码可能如下所示:

    async process(theObject) {
      return new Promise(resolve => {
        1 + 1 = 2;
        resolve();
      });
    }
    

    虽然这似乎是一种公平的模式,但它似乎是一种反模式,或一种代码气味。似乎还有一些关于Node/V8如何处理承诺的内容,这些承诺可能会在以后引入重大问题。有人对这种模式有什么想法吗?它是否有用?

    1 回复  |  直到 6 年前
        1
  •  0
  •   jakemingolla    6 年前

    使用的一个注意事项 Promise.all() 它是如何处理错误的。从 MDN :

    它拒绝的理由是第一个拒绝的承诺。

    因此,如果5000个对象的单个处理错误停止了整个过程,那么这似乎是一个不错的工具。我建议设置一个队列,将消息的处理与编排分离开来,并提供可伸缩性优势。