Node.js Promise.all 方法无法按预期保存多个猫鼬文档

Node.js Promise.all method not working as expected for saving multiple mongoose documents

我知道 Model.create(documentsArray)Model.bulkSave(documentsArray) 猫鼬 API。

我只是通过以下方式试验 Promise.all -


const promises = []
for(let i=1; i++; i<1000) {
 const promise = new UserModel({userId: Math.random() * 1000}).save()
 promises.push(promise)
}

console.time('t1')
await Promise.all(promises)
console.timeEnd('t1') // takes about 329.189ms

如果我用-

替换插入逻辑
console.time('t2')
for(const promise of promises) {
  await promise
}
console.timeEnd('t2') // takes about 335.268ms

如上文所述,t1t2 几乎相同! 如果我理解正确,为什么 Promise.all 不立即将所有保存请求发送到数据库。我在这里错过了什么?

注意:以上两个块都是为了

想象一下从亚马逊订购 3 个包裹。您的订单类似于您可以等待的“承诺”。

您正在考虑的 Promise.all(promises)for (p of promises) await p; 可以适用于此类比。

Promise.all 就像在说“等到 所有 我的包裹都到了。”他们到达的顺序无关紧要,但是当最后一个包裹到达时,您的等待就结束了——在这种情况下,当您拥有所有 3 个包裹时。

for-await 就像一个个等待他们:“等我的耳机到,然后等我的枕头到,然后再等我的 can-opener 到。”在这种情况下,如果can-opener先到,那么你大部分时间都在等待耳机,等到can-opener时,它可能已经到了,也可能有需要更多时间等待它。事实上,它可能在耳机之前就已经到了,只是你当时并没有明确地等待那个特定的包裹。它很可能已经坐在你的门廊上了。如果can-opener在back-order但耳机第二天就到了,那么你将花费大部分时间等待can-opener,耳机和枕头可能早就到了。不过,在最后一个包裹到达之前,您还没有完成所有的等待。

所以总持续时间是最长的交货时间。

请务必注意,您等待送货的顺序与送货到达所需的时间无关。您不能通过调整您希望接下来到达的包裹的顺序,您的亚马逊订单可以更快或更慢地到达。你可以坐在你的前门一厢情愿地只等耳机,有效地忽略送货员是否以及何时从你的枕头上掉下来或 can-opener。您所希望的不会影响先到达的包裹或需要多长时间。

Promise.all 可以 在您的 for-await 循环内部正确实现。因此,他们花费相同的时间也就不足为奇了。


或者考虑在同一天怀孕和订购披萨。这将需要大约九个月的时间,直到您可以说 both 已经交付。如果你先等宝宝,你的披萨会……很冷,仅此而已。