Chciałbym zwrócić obiekt z async / await funkcji A , aby przekazać go do innej funkcji.

Obecnie otrzymuję jako wynik Promise{ <pending> }' lub nieokreślony.

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

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

Jak zwrócić emailContent z funkcji A, aby użyć go w funkcji B?

Dzięki!

0
user7654321 3 kwiecień 2020, 23:31

3 odpowiedzi

Najlepsza odpowiedź

Ponieważ ustawiłeś getFeed jako asynchroniczne, nie potrzebujesz kolejnej asynchronicznej. Przechodzisz po pętli, więc zwróć tablicę obietnic. Gdy już zadzwonisz, użyj Promise.all, aby rozwiązać problem. Ponieważ do pobrania może być wiele adresów 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);
}
0
xdeepakv 3 kwiecień 2020, 20:37

W rzeczywistości getFeed () nie jest konieczne w wewnętrznym zakresie, możesz użyć async w wywołaniu zwrotnym mapy:

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
Andrzej T 3 kwiecień 2020, 20:47

Await nie będzie działać wewnątrz pętli forEach. Zamiast tego użyj pętli for ... in.

0
gravity 3 kwiecień 2020, 20:43