Async / Await使用Promise.all和.map函数无法正常工作

时间:2017-04-03 20:51:34

标签: javascript promise async-await ecmascript-2017

我有很多async个函数我正在使用,而且我有一个奇怪的问题。

我的代码,工作,看起来像:

async mainAsyncFunc (metadata) {
  let files = metadata.map(data => this.anotherAsyncFunc(data.url));
  return Promise.all(files);
}

anotherAsyncFunc功能如下:

  async anotherAsyncFunc (url) {
    return await axios({
      url,
    }).then(res => res.data)
      .catch(err => {
      throw err;
    });
  }

当我尝试将更多数据附加到第一个函数(mainAsyncFunc)返回的内容时,我的问题出现了。我的想法是在map中自然地做到这一点,当所有的说完成时,修改它看起来像:

async mainAsyncFunc (metadata) {
    files = metadata.map(data => {
        return new Promise((resolve) => {
          let file = this.anotherAsyncFunc(data.download_url);
          let fileName = data.name;
          resolve({
            file,
            fileName
          });
        });
      });
    return Promise.all(files);
}

如果不清楚,我会像平常一样获取文件,并向其附加一个fileName,然后重新解析该对象。

由于某种原因,这是返回一个挂起的Promise,而我希望它等待它们被完成,然后作为一个完整的文件和一个对象的名称返回。任何帮助理解我做错的事情都会非常感激。

2 个答案:

答案 0 :(得分:10)

看起来你已经解决了你的问题,就像一个指针一样,你可以进一步简化你的代码,如下所示:

{{1}}

答案 1 :(得分:3)

刚刚解决了这个问题:

  files = metadata.map(async (data) => {
    let file = await this.anotherAsyncFunction(data.download_url);
    let fileName = data.name;
    return {
      file,
      fileName
    };
  });

我需要将匿名函数包装在async中,以便我可以在其中使用await。希望这可以帮助其他有类似问题的人!