新手求教,node-lessons,lesson4的挑战
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);
});