【问题标题】:Perform async operations with Promise.all issue使用 Promise.all 问题执行异步操作
【发布时间】:2020-11-14 22:46:52
【问题描述】:

我是 nodejs 的新手,对我来说 Promise 似乎有点难以理解。我有一个要求,我有一个对象数组(假设来自数据库的大数据)。我需要遍历每个数据并针对该特定数据并行执行两个异步操作(数据库操作)。

这是附加的示例 sn-p。

const data = [
 {
     "id": 1
 },
 {
     "id": 2
 },
 {
     "id": 3
 },
 {
     "id": 4
 },
 {
     "id": 5
 }
];


(async () =>  {
    
    const first = async(id) => {
      // db operation  
      return new Promise(resolve => setTimeout(() => {
        console.log("first", id);
        resolve();
      }, 100 * Math.random()));
    };
    
    const second = async(id) => {
        // db operation
        return new Promise(resolve => setTimeout(() => {
        console.log("second", id);
        resolve();
      }, 100 * Math.random()));
    };
    
    const promiseResp = data.map(async(d) => {
        await first(d.id);
        await second(d.id);
    });
    
    await Promise.all(promiseResp);
})();

得到响应:

first 5
first 3
second 5
first 4
first 2
first 1
second 3
second 2
second 4
second 1

我希望代码可以针对相同的数据并行运行。但反应并没有像我期望的那样。我的期望是相同的 id,并行执行第一个和第二个异步操作,并在移动到下一个对象之前提供输出。我们怎样才能做到这一点?

有人可以告诉我我在哪里失踪吗?任何帮助将不胜感激?

编辑:另外,我们如何对所有数据执行并行操作?

【问题讨论】:

  • 你明确地在做await first(d.id); await second(d.id);,它按id顺序运行这两个函数。
  • @Bergi 对不起,我没明白你的意思。请再来?

标签: javascript node.js promise async-await


【解决方案1】:

要并行运行firstsecond,您不会使用await,而是使用

const promises = data.map(d =>
    Promise.all([
        first(d.id),
        second(d.id),
    ])
);
await Promise.all(promises);

在移动到下一个对象之前提供输出

为此,您不能使用data.map,而是使用awaits 每个对象的结果的顺序循环:

for (const d of data) {
    await Promise.all([
        first(d.id),
        second(d.id),
    ]);
}

【讨论】:

  • 对于并行运行每个数据的所有操作,我的代码就足够了吗?
  • 在第一部分我们可以在 Promise.all 之前使用 await 吗?
  • @Vishnu 你的意思是在map?那里不需要await,因为map 回调应该返回Promise.all 调用创建的承诺。
猜你喜欢
  • 2011-03-20
  • 2019-05-27
  • 2017-02-05
  • 1970-01-01
  • 2019-05-17
  • 2015-04-24
  • 1970-01-01
  • 2013-06-09
  • 2023-03-25
相关资源
最近更新 更多