提问者:小点点

使用Promise.All问题执行异步操作


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

下面是所附的示例片段。

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,首先执行&;其次,并行异步操作,并在移动到下一个对象之前提供输出。我们怎样才能做到这一点呢?

有人能让我知道我失踪的地方吗?如有任何帮助,我们将不胜感激?

编辑:还有,我们如何执行所有数据的并行操作?


共1个答案

匿名用户

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

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

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

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

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

相关问题