我正在处理 Node.js 中的循环,它为循环的每次迭代执行两个任务。为了简化,代码总结在:
- 从网页中提取产品元数据(阻塞任务)。
- 将所有产品元数据保存到数据库(异步任务)。
保存操作(2
)将在数据库中执行大约 800 个操作,并且不需要阻塞主线程(我仍然可以从网页中提取产品元数据)。
所以,话虽这么说,等待产品被保存是没有任何意义的。但是,如果我在不等待 promise 的情况下抛出 promise ,在循环的最后一次迭代中,Node.js 进程退出并且所有未决操作都没有完成。
解决这个问题的最佳方法是什么?是否有可能在没有完成 promise 或发射器的计数器的情况下实现它?谢谢。
for (let shop of shops) {
// 1
const products = await extractProductsMetadata(shop);
// 2
await saveProductsMetadata(products);
}
最佳答案
将 promise 收集到一个数组中,然后在其上使用 Promise.all
:
const storePromises = [];
for (let shop of shops) {
const products = await extractProductsMetadata(shop); //(1)
storePromises.push(saveProductsMetadata(products)); //(2)
}
await Promise.all(storePromises);
// ... all done (3)
这样一来,(1) 会依次运行,(2) 会并行运行,(3) 会依次运行。
当然你也可以并行运行 (1) 和 (2):
await Promise.all(shops.map(async shop => {
const products = await extractProductsMetadata(shop); //(1)
await saveProductsMetadata(products);
}));
如果其中一个 promise 发生错误,您可以使用 try/catch
block 来处理它,以确保所有其他商店不会受到影响:
await Promise.all(shops.map(async shop => {
try {
const products = await extractProductsMetadata(shop); //(1)
await saveProductsMetadata(products);
} catch(error) {
// handle it here
}
}));
how to signal node to finish the process ?
您可以手动调用 process.exit(0);
,但这隐藏了真正的问题:如果 不再有监听器,NodeJS 会自动退出。这意味着您应该在上述代码完成后关闭所有数据库连接/服务器等。
关于javascript - Node.js - 等待循环中抛出的所有 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55806839/