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

前端之家收集整理的这篇文章主要介绍了javascript – Async / Await使用Promise.all和.map函数无法正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一大堆我正在使用的异步函数,我有一个奇怪的问题.

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

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)返回的内容时,我的问题出现了.我的想法是在地图中自然地做到这一点,当所有的说完成后,修改它看起来像:

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,而我希望它等待它们被完成,然后作为一个完整的文件和一个对象的名称返回.任何帮助了解我做错了什么都将非常感激.

解决方法

看起来你已经解决了你的问题,就像一个指针一样,你可以进一步简化你的代码,如下所示:
async anotherAsyncFunc (url) {
    return (await axios({ url })).data;
}

async mainAsyncFunc (Metadata) {
    let files = Metadata.map(async data => ({
        file: await this.anotherAsyncFunc(data.download_url),fileName: data.name
    }));

    return Promise.all(files);
}

猜你在找的JavaScript相关文章