【发布时间】: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