【发布时间】:2019-04-26 14:32:46
【问题描述】:
在进行代码审查时,我最近遇到了这样的代码块:
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 所有 Promise,因此这种分块。
在我的反馈中,我写道这似乎是一种反模式,因为我们也在等待 Promises在之前的迭代中得到解决,以下是处理此类情况的正确方法:
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 在两种情况下都是相同的。
我了解data 在这两种情况下的填充方式。我想知道等待已经实现的承诺(发生在第一个代码块中)的性能开销是多少,是否重要?
【问题讨论】:
-
这两个代码块根本不一样...第一个的数据最终会比数据中的第二个少
-
这里的意图还不清楚。当然,如果这是关于聚集到
data,那么这两个列表可能都不是那么理想。为了澄清到目前为止我在这里看到的 cmets,示例 1 是“重新分配”data和 2。是“尝试”累积。不幸的是,在这里真正理解上下文有点“元”。没有上下文,任何答案都没有任何意义。最好让 cmets 冷静下来并让 OP 澄清。 -
如果你在循环之外使用第二个变体和
await data,这将是最快的选择 -
抱歉@sbmthakur 我被代码的最后一部分分心了,错过了嵌套差异。
-
@CertainPerformance 不,它们仍然是 Promise。
标签: javascript node.js asynchronous promise async-await