javascript - 等待 Promise.all 中的 array.map 迭代
问题描述
如果客户不存在,我有以下代码应该为客户添加项目。执行应该是并行的。
await Promise.all(
customers.map(async (customer) => {
return customer.items.map(async (item) => {
return new Promise(async (resolve) => {
const productExists = someArray.some(
(arrayValue) => arrayValue === item.id
);
if (!productExists) {
logger.info(
`customer item ${item.id} does not exist, creating...`
);
await createCustomerItem(item.id);
logger.info(`customer item ${item.id} created.`);
someArray.push(item.id);
} else {
logger.info(`customer item ${item.id} already exists, skipping...`);
}
resolve(true);
});
});
})
);
logger.info(`All items should now be present`);
问题是在以下情况下执行不等待createCustomerItem
解决!productExists)
这是日志
customer item 32310 does not exist, creating...
customer item ao does not exist, creating...
customer item ute does not exist, creating...
All items should not be present
customer item ao created.
customer item ute created.
customer item 32310 created.
自然All items should not be present
应该排在最后。
当所有项目都已经存在时,该过程看起来不错。
解决方案
你可以做这样的事情
const fruitsToGet = ['apple', 'grape', 'pear']
const mapLoop = async () => {
console.log('Start')
const promises = await fruitsToGet.map(async fruit => {
const numFruit = new Promise((resolve, reject) => {
setTimeout(() => resolve(fruit), 1000)
});
return numFruit
})
const numFruits = await Promise.all(promises)
console.log(numFruits)
console.log('End')
}
mapLoop();
结果
Start
["apple", "grape", "pear"]
End
推荐阅读
- python - 从脚本以编程方式调用 Jupyter Notebook 魔术命令
- python - 填充 Django SQL 数据库
- amazon-web-services - 如何从命令行下载/拉取 lambda 代码到本地机器?
- arrays - 如何遍历c中函数传递的结构数组?
- node.js - MongoDB 发现 $in 排序问题
- corda - 我们如何在 CordApp 的 Contract-States 库中访问 NetworkMapCache
- github - 如何以编程方式阻止 GitHub PR 合并
- grafana - 使用 kubeflow 的 Grafana
- unity3d - Unity 上的项目路径无效
- c# - ADODB.Command,查找满足条件的行