Chờ các lần lặp lại array.map trong Promise.all [trùng lặp]
Tôi có mã sau đây sẽ thêm các mặt hàng cho khách hàng nếu chúng chưa tồn tại. Việc thực hiện phải song song.
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`);
Vấn đề là việc thực thi không chờ createCustomerItemgiải quyết trong các trường hợp!productExists)
Đây là nhật ký
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.
Đương nhiên All items should not be presentnên đến sau cùng.
Khi tất cả các mục đã tồn tại, thì quá trình có vẻ tốt.
Trả lời
Hãy thử với flatMap:
await Promise.all(
customers.flatMap(async (customer) => {
return customer.items.map(async (item) => {
Thay vì trả về một mảng các Lời hứa, nó sẽ san phẳng nội dung thành một mảng Lời hứa đơn giản, đó là những gì Promise.allmong đợi.
NB Câu hỏi của bạn không rõ ràng nếu nhóm các mặt hàng cho mỗi khách hàng cần được bảo tồn. Nếu có, hãy lưu ý rằng giải pháp này thay đổi cấu trúc dữ liệu thành một danh sách phẳng, vì vậy bạn sẽ mất nhóm. Thêm một số customerIdvào items của bạn hoặc thử đề xuất của @ blex trong nhận xét.
bạn có thể làm một cái gì đó như thế này
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();
các kết quả
Start
["apple", "grape", "pear"]
End
nguồn demo