新手求教,node-lessons,lesson4的挑战
发布于 4 天前 作者 dilingchen 1584 次浏览 来自 问答

lesson4中的挑战需要拿到用户在 cnode 社区的积分值,需要异步访问用户的主页,拿到积分后再组成最后的返回值。 topics.map 是个同步方法,不知道如何在里面实现异步调用,再回调。node.js新手入门,对callback的用法还不太理解,网上找到一个如何在map中调用异步函数的例子https://futurestud.io/tutorials/node-js-how-to-run-an-asynchronous-function-in-array-map,但是套进来还是不对的。求指教。

ep.after('topic_html', topicUrls.length, function (topics) {
      const promises = topics.map(async topicPair => {
        var topicUrl = topicPair[0];
        var topicHtml = topicPair[1];
        var $ = cheerio.load(topicHtml);
        var title= $('.topic_full_title').text().trim();
        var comment1 = $('.reply_area').first();
        var author1 = $(comment1).find('div.user_info').find('a.reply_author');
        var author1Href = url.resolve(cnodeUrl, $(author1).attr('href'));
        var comment1Text = $(comment1).find('div.reply_content').children().first().text().trim();
        var author1Name = $(author1).text().trim();
      
        const userScore = await superagent.get(author1Href)
          .end(function (err, res) {
            if (err) {
              return console.error(err);
            }
            console.log('fetch ' + author1Href + ' successful');
            var $ = cheerio.load(res.text); 
            return $('.user_profile').find('span.big').text().trim();
          })

        return {
          title: title,
          href: topicUrl,
          comment1: comment1Text,
          author1: author1Name,
          score1: userScore,
        }
      })
      
      // wait until all promises resolve
      const results = await Promise.all(promises)
      console.log('final:');
      console.log(results);
    });
回到顶部