2017-05-23 55 views
0

我使用Async和Cheerio發生問題。與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功能的事件對象不爲空。

+0

我有很多問題。但最緊迫的是爲什麼地獄是'eval()'呢? –

+0

這不是主要問題,你可以看到'console.log(event)'也在工作。 – tonymx227

回答

1

問題是你返回forEach函數中的事件,所以它只是沒用。您還錯過map的迭代函數中的回調。

這應該工作:

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