我知道Array.prototype.map是同步操作。另一方面,如果map函数是回调函数(异步),undefined将立即返回。

所以我的问题是,下一个函数可以安全地假定所有回调函数都已完成吗?
示例代码可能使我的问题更清楚:

results = files.map(file => {
  fs.readFile(file, (err, data) => {
    if (err) throw err;
    return process(file) //will return the processed value, NOT a promise
  });
)
//I know results will be [undefined, undefined, undefined ...]
//But can I assume all the files have been processed if I reach here?
console.log('done')


我不在乎返回值。这就是为什么我不想打扰await/async的原因。我只想确保所有回调函数都已调用并返回。那可能吗 ?

-------更新--------

除了答案,我发现这些文章还帮助我理解了这个问题:
https://medium.com/@antonioval/making-array-iteration-easy-when-using-async-await-6315c3225838
Using async/await with a forEach loop

我必须使用promise来确保所有回调迭代项都已完成。因此,使用bluebird promise.map有助于减少样板代码

最佳答案

您必须使回调函数具有前景,然后可以使用Promise.all:

 const results = Promise.all(files.map(file => new Promise(resolve => {
  fs.readFile(file, (err, data) => {
    if (err) throw err;
    resolve(process(file));
  });
 ));

 results.then(() => {
   console.log('done')
   //...
 });

07-24 17:52
查看更多