我尝试使用async.map功能实现一个scraper迭代一个数组,做一些逻辑然后将它们映射到不同的值。
async.map($('.listing tr').toArray(), GetLink, function(err, results) {
if (err) throw err;
console.log(results);
});
它使用cheerio模块循环遍历所有表行以获取它们的链接,然后在它们上完成一些逻辑(从它链接的页面获取信息)。
var GetLink = function(tablerow, callback) {
var nameElement = $(tablerow).children().first().find('a');
var link = nameElement.attr('href');
然后我使用' got'模块(更快/更准确的请求版本)来获取页面html。
got(link, function(error, html, resp) {
if (!error)
callback(null, html); // Sends the HTML back as an array result.
}
}
但是,即使回调是该范围内的有效函数,也不会运行async.map回调[function(err,results)]。
任何信息都将不胜感激。
答案 0 :(得分:1)
这就是堆栈溢出的方式..你花了很长时间试图自己修复它,一旦你发布了一个问题,你就弄明白了。
问题在于got
方法有时会出现错误,这意味着没有运行回调。因此我改变了:
if (!error)
callback(null, html);
到
if (!error)
callback(null, html);
else
callback(null, null);
如果没有逻辑方法中提供的保证回调,则永远不会运行async.map回调。