Как получить результат работы функции asyn c / await? - PullRequest
0 голосов
/ 03 апреля 2020

Я хотел бы вернуть объект из функции asyn c / 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);
    }

Как мне вернуть emailContent из функции A для использования это в функции B?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 03 апреля 2020

await не будет работать внутри forEach l oop. Вместо этого используйте for ... in l oop.

0 голосов
/ 03 апреля 2020

на самом деле, getFeed () не требуется внутри внутренней области видимости, вы можете использовать asyn c в обратном вызове карты:

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;
});
0 голосов
/ 03 апреля 2020

Поскольку вы сделали getFeed asyn c, вам не нужен еще один asyn c. Вы перебираете, так что возвращайте массив обещаний. Как только вы позвоните, используйте 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);
}
...