7

我有很多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);
}

如果不清楚,我会像往常一样获取文件本身,并将文件名附加到它,然后解析该对象。

出于某种原因,这将返回一个待处理的 Promise,而我希望它等待它们被实现,然后作为对象中的完整文件和名称返回。任何帮助理解我做错了什么将不胜感激。

4

2 回答 2

12

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

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);
}
于 2017-04-03T21:15:18.033 回答
3

刚刚解决了这个问题:

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

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

于 2017-04-03T20:59:02.997 回答