【问题标题】:How do I keep Promises.all from hanging my process?如何防止 Promises.all 挂起我的进程?
【发布时间】:2019-09-18 23:00:18
【问题描述】:

当我 await Promises.all 时,我的单元测试过程(带有 Mocha 的 npm)永远不会退出,但是当我 await 个人承诺时,它会退出。

async function f(){...}

async function getVals1() {
    const vals = await Promise.all([f(), f()]);
    return vals;
}

async function getVals2() {
    const vals = []
    vals.push(await f());
    vals.push(await f());
    return vals;
}

要点:

  • 这些值都是从await Promises.all 成功返回的。它们是预期值(即,它们本身不是 Promises),与单个 awaits 相同。一切正常,但npm 没有退出。
  • 问题并不总是发生,但我不知道是什么(如果有的话)导致了问题。
  • 应用程序使用 MongoDB,不关闭 MongoDB 连接会导致应用程序挂起。但我确实检查了 MongoDB 连接是否已关闭(在测试运行结束时,在此 await 调用之后很久;无论如何,await Promise.all 和单个 await 之间的区别很难解释。

【问题讨论】:

  • 请注意,getVals1 中的 async/await 确实没有意义,您可以使用 vanilla 函数和 return Promise.all([...])。就问题而言,您能否提供minimal reproducible example 说明您是如何调用这些的,以及 f 做了什么(例如,它是否有任何可能影响并行执行而不是串行执行的状态)?
  • "它有任何状态吗" -- 见 MongoDB 编辑; “最小的可重现示例”——这是最难的部分。我确实尝试缩小范围,但很难找到会触发此行为的条件。
  • 如果它在两个等待(即系列执行)下表现稳定,但在 Promise.all(即并行执行)中表现不稳定,那么我会寻找某种共享状态和竞争条件,但是问题可以更详细地回答。
  • //问题并不总是出现——这意味着promise处理没有问题。这与你的后端有关,它在不同的场合表现不同。您提供的代码无法重现您后端的这个问题。
  • 逻辑是 Promise.All() 没有技术缺陷。如果通过单独的调用解决了 5 个 Promise,则可以保证它们与 Promise.all() 一起运行良好。因此,问题在于您尚未在此处发布的代码。 (后端)

标签: javascript node.js npm async-await


【解决方案1】:

这是由于多次打开 MongoDB 客户端造成的,因此之后,虽然有些关闭,但有些没有。 mongoDbClient = await MongoClient.connect(...) 周围需要一个锁。

【讨论】:

    【解决方案2】:

    问题似乎在于您的一个或多个函数不是异步的。但是没有代码就很难理解

    【讨论】:

      猜你喜欢
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多