JSON文档神秘地“清空”

dlyk1988

我已经在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

这里是有趣的部分:当我尝试从“ request”块中的“第一个位置”输出JSON文档时,它确实不错。一个例子在这里:

{ date: Wed Nov 26 2014 10:35:09 GMT+0200 (EET),
  companies: 
   [ { name: ' J.P. MORGAN ASSET MANAGEMENT',
       link: 'mtfCompany?id=J.P.+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.' }]}

当我尝试从ANY块之外并在执行结束时从“第二名”输出JSON文档时,这是我得到的:

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

看起来JSON文档中的'companies'数组已清空。我怀疑'mutuals.companies = [];' 由于某种原因,该行再次被执行。

有人能帮忙吗?

更新1:

按照建议将我的代码更改为使用“ 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: [] }
丹尼尔

您的“第二名”是在请求完成之前打印变量。

您的“第一名”之所以有效,是因为它位于请求的回调中。发出请求,提取数据,然后调用回调并成功打印。

这就是异步代码的工作方式。没有障碍。因此,当您发出请求时,节点将存储回调函数,以便它可以使用请求的结果执行代码。

更新1:

您更新的问题大致相同。在系列的第一个函数中,callback在请求完成之前调用gets。如果将回调移动到传递给请求的函数中,则在请求完成后将调用它。

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');
        }
    });
},

建议1

在具有回调的node.js中进行开发可以使您拥有深层的嵌套结构。不要让您的if语句使嵌套更糟。使用早期回报而不是更深层的嵌套。例子:

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');
    });
},

建议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
]);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Android Java中执行某些无关的代码后,文件变量神秘地清空了

来自分类Dev

在电子中,Json 文件读取函数神秘地返回 null

来自分类Dev

fork() 神秘地包含

来自分类Dev

财产神秘地设为零

来自分类Dev

JPA @ElementCollection神秘地缓存

来自分类Dev

clearInterval 函数神秘地工作

来自分类Dev

PowerShell远程调用神秘地挂起

来自分类Dev

C ++ int的价值神秘地变化

来自分类Dev

硬盘神秘地移动文件夹

来自分类Dev

createjs:单击时形状神秘地移动

来自分类Dev

Firebase ref.once()被神秘地跳过

来自分类Dev

Numpy神秘地停止工作

来自分类Dev

jQuery DOM元素值神秘地减少

来自分类Dev

护栏神秘地重新启动

来自分类Dev

对Ubuntu的更改神秘地回滚了

来自分类Dev

Hangfire 后台作业神秘地停止运行

来自分类Dev

“假”神秘地出现在终端?

来自分类Dev

Glide 图像加载神秘地失败

来自分类Dev

Angular 渲染神秘的 JSON 数据

来自分类Dev

角度模板神秘地仅显示某些{{expressions}}

来自分类Dev

Gradle(2.3.9)神秘地讨厌将“版本”设置为数字

来自分类Dev

printf()如何“神秘地”知道我打算打印什么?

来自分类Dev

无法跟踪正在神秘地更改变量的内容

来自分类Dev

为什么会神秘地修改此字符串?

来自分类Dev

Shanks算法在某些数字上神秘地失败

来自分类Dev

MySQL TINYINT(1)神秘地映射到Java类型Integer

来自分类Dev

堆对齐的内存上的mprotect神秘地工作

来自分类Dev

Swift UICollectionView单元格神秘地重复

来自分类Dev

Ubuntu音频神秘地停止工作(12.04)