我正在使用一个在两个端点上都有数据的api:
我实际上需要获取所有属性,并且我计划构建一个主对象来驱动UI。
当前功能:
行为:
问题: -我的两个函数都可以解析,但是我的最终对象包含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>: {...}}
}
答案 0 :(得分:3)
getMetaPerArticle返回一个诺言,因此在尝试映射到parsedEnDataWithMeta之前,您需要等待这些诺言得到解决。像这样:
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));
}
};
答案 1 :(得分:1)
您的问题是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;
});