NodeJS中的双重回调

时间:2014-07-03 10:07:46

标签: javascript node.js callback

我不确定为什么下面这段代码会回拨两次:

request(url, function(error, response, html) {
                    if(!error){
                        var $ = cheerio.load(html);

                        $('.globleRank').filter(function(){
                            var data = $(this);
                            rank_global = .children().first().text().trim();
                            json.rank_global = rank_global;            
                        })

                        url = 'http://www.trafficestimate.com/www.'+site;
                        request(url, function(error, response, html) {
                            if(!error){
                                var $ = cheerio.load(html);
                                $('.chart-yoy span').filter(function(){ 

                                    var visits = $(this).children().first().text();

                                    json.visits = visits;        

                                    dat[site].push(json);                                       
                                    fs.writeFile(country_inp, JSON.stringify(dat, null, 4), function(err){
                                        console.log('Data successfully written for '+site+'! - Check your project directory for the '+country_inp+' file');
                                    })     
                                })

                            }
                        });



                    }      
                });

控制台输出是:

为Go.com成功编写数据! - 检查项目目录中的US文件 为Go.com成功编写数据! - 检查项目目录中的US文件

因此写入发生了两次。

请帮忙。

1 个答案:

答案 0 :(得分:0)

可能有多个$('.chart-yoy span')元素,这会使.filter()回调多次执行。

也许你想做

var $ = cheerio.load(html);
$('.chart-yoy span').each(function () {
    var visits = $(this).children().first().text();
    json.visits = visits;
    dat[site].push(json);
});
fs.writeFile(country_inp, JSON.stringify(dat, null, 4), function (err) {
    console.log('Data successfully written for ' + site + '! - Check your project directory for the ' + country_inp + ' file');
});

代替。