我在使用Async和Cheerio时遇到了问题。
我的代码:
var request = require('request'),
cheerio = require('cheerio'),
_ = require('lodash'),
sitesJson = require('./websites.json'),
Sequelize = require('sequelize'),
asyncFn = require('async');
asyncFn.map(sitesJson.sites, function(site) {
request(site.url, function (error, response, body) {
$ = cheerio.load(body);
$(site.eventsQuery).each( function() {
var event = {
title : eval(site.titleQuery),
description : eval(site.descriptionQuery),
thumbnail : eval(site.thumbnailQuery),
lat : eval(site.latQuery),
lng : eval(site.lngQuery)
};
console.log(event); // not null
return event;
});
});
}, function(err, results) {
console.log(results); // null
});问题:我无法获取事件...而在map函数中,事件对象不为空。
发布于 2017-05-24 20:24:02
问题是您在forEach函数中返回事件,所以它是无用的。您还会在map的iteratee函数中遗漏一个回调。
这应该是可行的:
var request = require('request'),
cheerio = require('cheerio'),
sitesJson = require('./websites.json'),
asyncFn = require('async');
asyncFn.map(sitesJson.sites, function(site, cb) {
request(site.url, function (error, response, body) {
$ = cheerio.load(body);
var events = $(site.eventsQuery).map(function(event) {
return {
title : eval(site.titleQuery),
description : eval(site.descriptionQuery),
thumbnail : eval(site.thumbnailQuery),
lat : eval(site.latQuery),
lng : eval(site.lngQuery)
}
});
cb(null, events);
});
}, function(err, results) {
console.log(results); // null
});此外,eval也不是必须的,应该有另一种方法来绕过它……
最重要的是,如果您需要处理多个URL,则可能需要考虑使用mapLimit
https://stackoverflow.com/questions/44137186
复制相似问题