【问题标题】:How to get the result of async / await function?如何获得 async / await 函数的结果?
【发布时间】:2020-04-03 20:31:10
【问题描述】:

我想从 async / await 函数 A 返回一个对象以将其传递给另一个函数。

目前我得到的结果是Promise{ <pending> }' 或未定义。

功能A:

const parseRss = data => data.forEach(rssLink => {
    const getFeed = async () => {
        try {
            const feed = await rssParser.parseURL(rssLink.rss);
            const emailContent = {
                emailBody: {
                    title: feed.title,
                    content: []
                }
            }

            feed.items.forEach(item => {
                feedObj.emailBody.content.push(`${item.title} : ${item.link}`)
            });
            return emailContent;
        } catch (e) {
            console.error(e);
        }
    };
    return (async () => {
        return await getFeed();
    })();
});

功能B:

    try {
        const data = await getDataWithRss();
        const emailData = await parseRss([{rss:'http://reddit.com/.rss'}]); // emailData is undefined
       return formatEmail(emailData);
    } catch (error) {
        console.log(error);
    }

如何从函数 A 返回 emailContent 以在函数 B 中使用它?

谢谢!

【问题讨论】:

  • await 必须在 async 函数内。函数 B 是 async 函数吗?
  • parseRss 正在返回data.forEach(...)forEach 将始终返回 undefined
  • 是的,函数 B 是异步的
  • 如果您有多个网址会怎样?是否要在已解析的承诺中返回 emailContent 数组(每个 URL 一个)?

标签: javascript node.js asynchronous promise async-await


【解决方案1】:

由于您将getFeed 设为异步,因此不需要另一个异步。您正在循环,因此返回一组承诺。一旦你打电话使用Promise.all 来解决。因为可能需要获取多个 url。

const parseRss = (data) =>
  data.map((rssLink) => {
    const getFeed = async () => {
      try {
        const feed = await rssParser.parseURL(rssLink.rss);
        const emailContent = {
          emailBody: {
            title: feed.title,
            content: [],
          },
        };

        feed.items.forEach((item) => {
          feedObj.emailBody.content.push(`${item.title} : ${item.link}`);
        });
        return emailContent;
      } catch (e) {
        console.error(e);
      }
    };
    return getFeed();
  });
  try {
    const data = await getDataWithRss();
    const emailData = await Promise.all(parseRss([{rss:'http://reddit.com/.rss'}])); // emailData is undefined
   return formatEmail(emailData);
} catch (error) {
    console.log(error);
}

【讨论】:

    【解决方案2】:

    await 在 forEach 循环中不起作用。请改用 for...in 循环。

    【讨论】:

      【解决方案3】:

      实际上,getFeed() 在内部范围内不是必需的,您可以在地图回调中使用异步:

      const parseRss = data => data.map(async rssLink => {
          const feed = await rssParser.parseURL(rssLink.rss);
          const emailContent = {
              emailBody: {
                  title: feed.title,
                  content: []
              }
          };
      
          feed.items.forEach(item => {
              feedObj.emailBody.content.push(`${item.title} : ${item.link}`)
          });
      
          return emailContent;
      });
      

      【讨论】:

        猜你喜欢
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 2020-08-01
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        相关资源
        最近更新 更多