javascript - NodeJS Promise.all 正在等待所有组件完成后再继续

标签 javascript node.js promise async-await

我正在尝试处理由对象组成的数组。每个对象都有一个字段,其值是数字数组。我想以异步/等待方式处理所有数字数组的所有组件。

数据示例如下:

const data = [{
  numbers: [1, 2, 3],
}, {
  numbers: [4, 5, 6],
}, {
  numbers: [7, 8, 9],
}];

我通过两种方式实现了这个功能。第一个代码是这样的:

const processData1 = async(data) => {
  return Promise.all(data.map(async(d) => {
    const partial = await Promise.all(d.numbers.map(async(n) => {
      console.log('INIT', n);
      const number = await processNumber(n);
      console.log('END', n);
      return number;
    }));
    return partial;
  }));
};

第二个是这样的:

const processData2 = async(data) => {
  for (const d of data) {
    for (let n of d.numbers) {
      console.log('INIT', n);
      n = await processNumber(n);
      console.log('END', n);
    }
  }
};

我希望在所有情况下在控制台中看到的都是按正确顺序依次打印的“INIT”和“END”。在第二个代码函数中也是如此。但在第一个中,我看到与数字一样多的 INIT,然后是所有相应的 END:

**** processData1 ****
INIT 1
INIT 2
INIT 3
INIT 4
INIT 5
INIT 6
INIT 7
INIT 8
INIT 9
END 1
END 2
END 3
END 4
END 5
END 6
END 7
END 8
END 9
**** processData2 ****
INIT 1
END 1
INIT 2
END 2
INIT 3
END 3
INIT 4
END 4
INIT 5
END 5
INIT 6
END 6
INIT 7
END 7
INIT 8
END 8
INIT 9
END 9

这怎么可能?为什么await processNumber等待所有数字被解析?

最佳答案

在第一个示例中,您只需等待 Promise.all 的结果,这意味着每个 Promise 都会同时执行。在第二个示例中,您等待每个单独的 promise ,这迫使它们连续执行。

两种方案都有其用途,如果您不关心顺序,即操作可以同时运行,第一种方案更好,第二种方案对于强制异步代码按顺序执行非常有用。

关于javascript - NodeJS Promise.all 正在等待所有组件完成后再继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51437452/

相关文章:

ajax - polymer 1.0 : Wait for multiple iron-ajax requests to finish

javascript - 使用 Amplify JS 存储 Knockout JS 模型数据

javascript - 替换字符串中找到的元素前面

javascript - 仅当我们单击窗口上的任意位置时打开菜单时才切换菜单

javascript - 主干、js 和 node.js 渲染和路由

javascript - axios IE promise 不起作用

javascript - 面向对象的 JavaScript 工具

node.js - 如何在 Redis 的列表中存储哈希值?

Node.js Express 与 Flatiron

javascript - Javascript 中的 promise