Async/Await 无法按预期使用 Promise.all 和 .map 函数
Async/Await not working as expected with Promise.all and a .map function
我正在使用大量 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
) returns 时,我的问题就来了。我的想法是在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,而我希望它等待它们完成,然后作为对象中的完整文件和名称返回。如果能帮助我理解我做错了什么,将不胜感激。
刚刚解决了问题:
files = metadata.map(async (data) => {
let file = await this.anotherAsyncFunction(data.download_url);
let fileName = data.name;
return {
file,
fileName
};
});
我需要将匿名函数包装在 async
中,以便我可以在其中使用 await
。希望这对遇到类似问题的其他人有所帮助!
看起来你的问题已经解决了,只是一点指点,你可以进一步简化你的代码如下:
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);
}
我正在使用大量 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
) returns 时,我的问题就来了。我的想法是在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,而我希望它等待它们完成,然后作为对象中的完整文件和名称返回。如果能帮助我理解我做错了什么,将不胜感激。
刚刚解决了问题:
files = metadata.map(async (data) => {
let file = await this.anotherAsyncFunction(data.download_url);
let fileName = data.name;
return {
file,
fileName
};
});
我需要将匿名函数包装在 async
中,以便我可以在其中使用 await
。希望这对遇到类似问题的其他人有所帮助!
看起来你的问题已经解决了,只是一点指点,你可以进一步简化你的代码如下:
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);
}