如何获得异步/等待功能的结果?

时间:2020-04-03 20:31:10

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

我想从async / await function 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中使用它?

谢谢!

3 个答案:

答案 0 :(得分:0)

由于您将getFeed设为异步,因此无需其他异步。您正在遍历,所以返回一个诺言数组。致电后,请使用Promise.all进行解决。由于可能要提取多个网址。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

实际上,在内部范围内不需要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;
});