JSON文件神秘地“清空”

我已经在Node.js中写了一个小脚本来抓取网页并获得一些链接。 报废部分与Cheerio完成。 我的代码在这里(简化了空间):

var request = require('request'); var cheerio = require('cheerio'); var base_url = 'http://www.naftemporiki.gr/finance/'; var mutuals = {}; mutuals.date = new Date(); mutuals.companies = []; var company = {}; request(base_url + 'mtfCompanies', function (error, response, html) { if (!error && response.statusCode == 200) { var $ = cheerio.load(html); $('.blueRow.texttd.name a').each(function (i, element) { var a = $(this); company = {}; company.name = a.text(); company.link = a.attr('href'); mutuals.companies.push(company); }); } //console.log(mutuals); // 1st place }); console.log(mutuals); // 2nd place 

这里有趣的部分:当我试图从“第一名”,在“请求”块内输出JSON文件,它出来很好,真实。 这里是一个例子:

 { date: Wed Nov 26 2014 10:35:09 GMT+0200 (EET), companies: [ { name: ' JP MORGAN ASSET MANAGEMENT', link: 'mtfCompany?id=JP+MORGAN+ASSET+MANAGEMENT' }, { name: ' BNP PARIBAS INVESTMENT PARTNERS', link: 'mtfCompany?id=BNP+PARIBAS+INVESTMENT+PARTNERS' }, { name: ' PICTET', link: 'mtfCompany?id=PICTET' }, { name: ' ALLIANZ ΑΕΔΑΚ', link: 'mtfCompany?id=ALLIANZ+%ce%91%ce%95%ce%94%ce%91%ce%9a' }, { name: ' ALLIANZ ΑΕΔΑΚ (ΑΝΤΙΠΡ.)', link: 'mtfCompany?id=ALLIANZ+%ce%91%ce%95%ce%94%ce%91%ce%9a+(%ce%91%ce%9d%ce%a4%ce%99%ce%a0%ce%a1.)' }, { name: ' ALLIANZ ΕΛΛΑΣ Α.Ε.', link: 'mtfCompany?id=ALLIANZ+%ce%95%ce%9b%ce%9b%ce%91%ce%a3+%ce%91.%ce%95.' }]} 

当我试图从“第二位”输出JSON文件,在任何块之外和执行结束时,这是我得到的:

 { date: Wed Nov 26 2014 10:35:09 GMT+0200 (EET), companies: [] } 

它看起来像JSON文档中的“公司”数组被清空。 我怀疑'mutuals.companies = [];' 线由于某种原因再次被执行。

有人能帮忙吗?

更新1:

改变我的代码build议使用“async.series …”。 这是更新的版本:

 var request = require('request'), async = require('async'), cheerio = require('cheerio'); var base_url = 'http://www.naftemporiki.gr/finance/'; var mutuals = {}; mutuals.date = new Date(); mutuals.companies = []; var company = {}; async.series([ function(callback) { request(base_url + 'mtfCompanies', function (error, response, html) { if (!error && response.statusCode == 200) { var $ = cheerio.load(html); $('.blueRow.texttd.name a').each(function (i, element) { var a = $(this); company = {}; company.name = a.text(); company.link = a.attr('href'); mutuals.companies.push(company); }); } }); callback(null, 'one'); }, function (callback) { console.log(mutuals); callback(null, 'two'); } ]); 

依然不起作用。 仍然输出的JSON是这样的:

 { date: Wed Nov 26 2014 10:35:09 GMT+0200 (EET), companies: [] } 

您的“第二位”是在请求结束之前打印variables。

您的“第一名”工作,因为它位于请求的callback内。 请求已经完成,数据被拉出,callback被调用并成功打印。

这是asynchronous代码的工作方式。 什么都不阻止 所以当你发出你的请求时,节点存储callback函数,以便它可以用请求的结果执行代码。

更新1:

你的更新的问题大多是相同的。 在系列的第一个函数中, callback在请求完成之前被调用。 如果将callback移入传递给请求的函数,则在请求完成后调用它。

 function(callback) { request(base_url + 'mtfCompanies', function (error, response, html) { if (!error && response.statusCode == 200) { var $ = cheerio.load(html); $('.blueRow.texttd.name a').each(function (i, element) { var a = $(this); company = {}; company.name = a.text(); company.link = a.attr('href'); mutuals.companies.push(company); }); callback(null, 'one'); } }); }, 

build议1

使用callback进行node.js开发可以为您提供深层嵌套结构。 不要让你的陈述使嵌套更糟。 使用早期返回而不是更深的嵌套。 例:

 function(callback) { request(base_url + 'mtfCompanies', function (error, response, html) { if(error) return callback(error); if(response.statusCode !== 200) return callback('status code not 200'); var $ = cheerio.load(html); $('.blueRow.texttd.name a').each(function (i, element) { var a = $(this); company = {}; company.name = a.text(); company.link = a.attr('href'); mutuals.companies.push(company); }); callback(null, 'one'); }); }, 

build议2

使用async ,可以通过使用命名函数来帮助简化事情。 例:

 var request = require('request'), async = require('async'), cheerio = require('cheerio'); var base_url = 'http://www.naftemporiki.gr/finance/'; var mutuals = {}; mutuals.date = new Date(); mutuals.companies = []; var company = {}; function getPage(callback) { request(base_url + 'mtfCompanies', function (error, response, html) { if(error) return callback(error); if(response.statusCode !== 200) return callback('status code not 200'); var $ = cheerio.load(html); $('.blueRow.texttd.name a').each(function (i, element) { var a = $(this); company = {}; company.name = a.text(); company.link = a.attr('href'); mutuals.companies.push(company); }); callback(null, 'one'); }); } function printMutuals(callback) { console.log(mutuals); callback(null, 'two'); } async.series([ getPage, printMutuals ]);