我有很多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,而我希望它等待它们被完成,然后作为一个完整的文件和一个对象的名称返回。任何帮助理解我做错的事情都会非常感激。
答案 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
。希望这可以帮助其他有类似问题的人!