javascript - Node.js - 等待循环中抛出的所有 promise

标签 javascript node.js

我正在处理 Node.js 中的循环,它为循环的每次迭代执行两个任务。为了简化,代码总结在:

  1. 从网页中提取产品元数据(阻塞任务)。
  2. 将所有产品元数据保存到数据库(异步任务)。

保存操作(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/

相关文章:

node.js - 有时拉丁字母 (ä ö ü è ß) 字符会返回为 �

javascript - 使用 javascript/Jquery 循环对象创建 AND 运算符

javascript - 不同事件监听器中的可变可访问性

javascript - Eslint 和 VueJS 文件。抛出错误但不修复它们

google-chrome - chrome - 不要等到所有数据都收到 - node.js

node.js - body-parser 对 express 有什么作用?

node.js - 将标准输出重定向到文件 nodejs

javascript - 在 Node.js 和 Delphi 应用程序之间交换消息

javascript - Javascript 中是否有零默认运算符的简写方法?

javascript - MeteorJS 发布查询不起作用