【发布时间】:2021-03-17 21:56:39
【问题描述】:
如果客户不存在,我有以下代码应该为客户添加项目。执行应该是并行的。
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`);
问题是在!productExists)的情况下执行不是等待createCustomerItem解决
这是日志
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 当然应该排在最后。
当所有项目都已存在时,该过程看起来不错。
【问题讨论】:
-
map对承诺一无所知。所以很遗憾,您不能以这种方式使用地图。 -
我会说这是因为 Promise.all 需要一个 Promise 数组,而您正在向它传递一个 Promise 数组数组。改用 flatMap。
-
我认为@JulienD 在他们的评论中提到的内容将解决您的问题。
-
... 或简单地将
return customer.items.map()替换为return Promise.all(customer.items.map())
标签: javascript node.js asynchronous promise