【发布时间】:2020-06-29 23:25:13
【问题描述】:
let shouldHavePaid = 0;
demographicsArray.map((country) => {
if (country.checked == true) {
Price.findOne({ country: country._id }).then((priceRes) => {
if (priceRes) {
shouldHavePaid = shouldHavePaid + priceRes.priceSMS * country.count;
} else {
shouldHavePaid = shouldHavePaid + 0.1 * country.count; //Default price for unlisted countries
}
});
}
});
console.log(`Finish: ${shouldHavePaid}`);
我希望最后的 console.log 在地图之后执行,但它会在地图完成之前触发。 我期待这个输出,因为据我所知地图应该是同步的而不是异步的。我相信对数据库的请求搞砸了?你会在这里建议什么?
【问题讨论】:
-
1.请不要使用
.map进行简单的迭代。为此使用循环或.forEach。 2..map是一个同步操作,但是你在里面启动异步操作。您要么需要使所有异步并使用Promise.all并等待所有完成(并行),要么转换为常规循环和await每次迭代(顺序)。您也可以reduce进行单个顺序操作,但我可能会使用循环。 -
谢谢,为什么不建议使用 map 进行简单的迭代?对于使用等待的能力?
-
It's the wrong tool 这是误导性的。映射操作是 1:1 转换。将它用于其他任何事情都会向将来查看代码的任何人发送错误信息,包括您自己。
.map是 JavaScript 和许多其他语言中的一个成语。对于常见的数组操作,还有许多其他更好的习惯用法。检查我的个人资料信息。
标签: javascript node.js asynchronous async-await