使用多个async / await调用构建对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用多个async / await调用构建对象相关的知识,希望对你有一定的参考价值。
我正在使用一个api,它有两个端点上的数据:
- / news获取包含少量属性的文章列表
- / news / {id} / metadata获取文章的所有属性
我实际上需要获取所有属性,并且我计划构建一个主对象来驱动我的UI。
目前的职能:
- getNews:一个async / await函数,成功从/ news获取文章列表
- getMetaPerArticle:另一个async / await函数,它接受一个ID并调用/ news / {id} / metadata
行为:
- 我运行getNews异步函数并等待响应
- 当响应通过我映射响应数组并在数组中的每个项上运行getMetadata函数时
- 一旦getMetadata完成,结果将存储到常量,并分配给element.metadata
问题: - 我的两个函数都解析了,但我的最终对象包含Promise.resolve对象。对象具有正确的值。
码
const getNews = async options => {
try {
const { data } = await axios(options);
const parsedEnDataWithMeta = parsedEnData.map(article => {
const mergedArticleWithMeta = {
...article,
...getMetaPerArticle(article.id)
};
return mergedArticleWithMeta;
});
} catch (getNewsError) {
dispatch(receiveNewsError(getNewsError));
}
};
const getMetaPerArticle = async articleID => {
const axiosOptions = {
method: "GET",
url: `url`,
};
try {
const response = await axios(axiosOptions);
return response.data;
} catch (err) {
console.error(err);
dispatch(receiveNewsError(err));
}
};
产量
(6) [{…}, {…}, {…}, {…}, {…}, {…}]
0: {
abstract: "",
...
metadata: Promise {<resolved>: {...}}
}
答案
getMetaPerArticle返回一个promise,因此在尝试映射到parsedEnDataWithMeta之前,您需要等待这些promises解析。像这样的东西:
const getNews = async options => {
try {
const { data } = await axios(options);
const metadataPromises = data.map(article => getMetaPerArticle(article.id));
const metadata = await Promise.all(metadataPromises);
const parsedEnDataWithMeta = data.map((article, i) => ({
...article,
...metadata[i]
});
} catch (getNewsError) {
dispatch(receiveNewsError(getNewsError));
}
};
另一答案
你的问题是getMetaPerArticle
返回一个Promise,所以你需要在它中添加一个await
,并将箭头函数标记为async
。
const parsedEnDataWithMeta = parsedEnData.map(async article => {
const mergedArticleWithMeta = {
...article,
...await getMetaPerArticle(article.id)
};
return mergedArticleWithMeta;
});
之后parsedEnDataWithMeta
将保留一份Promises列表,所以你需要等待,直到所有这些都使用Promise.all
解决:
const parsedEnDataWithMeta = await Promise.all(parsedEnData.map(async article => {
const mergedArticleWithMeta = {
...article,
...await getMetaPerArticle(article.id)
};
return mergedArticleWithMeta;
}));
如果您需要更频繁地使用它,那么您可以定义一个将处理承诺的map函数:
function promiseMap( array, callback ) {
return Promise.all(array.map(callback))
}
const parsedEnDataWithMeta = await promiseMap(parsedEnData, async article => {
const mergedArticleWithMeta = {
...article,
...await getMetaPerArticle(article.id)
};
return mergedArticleWithMeta;
});
以上是关于使用多个async / await调用构建对象的主要内容,如果未能解决你的问题,请参考以下文章
Async-Await:即使一个错误,如何在多个等待调用中获取数据?