首页 > 解决方案 > 使用多个 async/await 调用构建对象

问题描述

我正在使用一个在两个端点上有数据的 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>: {...}}
}

标签: javascriptasync-await

解决方案


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));
  }
};

推荐阅读