代码之家  ›  专栏  ›  技术社区  ›  Qiulang

Array.prototype.map()之后的下一个函数能否安全地假设map中的所有回调都已返回?

  •  0
  • Qiulang  · 技术社区  · 6 年前

    我知道 Array.prototype.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 有助于减少样板代码

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jonas Wilms    6 年前

     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')
       //...
     });