Nodejs&要求& Cheerio:无法从请求中添加到全局数组

时间:2016-08-14 07:03:33

标签: javascript node.js scope request closures

我是一个相对较新的javascript开发人员,我遇到了一个我似乎无法追查的问题,我认为我可能正在寻找错误的位置。看起来它可能与范围/闭包有关,但我似乎无法让它工作。在这里:

我有一个名为arr的全局范围数组。我使用node.js,request和cheerio来访问网站并获取信息 - 在此插图中,http://www.google.com上每个链接的href属性。然后我将它们插入到全局范围的数组中。但是,在'request'之外,Array似乎仍然是空的。

var request = require('request');
var cheerio = require('cheerio');
var arr = []
var url = 'http://www.google.com';

request(url, function(err, resp, body)  {
  var $ = cheerio.load(body);
  $('a').each(function(i, link){
    arr.push(link['attribs']['href']);
  });
});

console.log(arr); // prints nothing

我知道这很可能是我所忽视的非常简单的事情,但是如果有人可以帮我解释原因,我会非常感激。谢谢。

1 个答案:

答案 0 :(得分:0)

实际上正在填充arr。但是在请求调用完成之前,语句console.log(arr)已被删除。这是因为node.js的非阻塞属性。 您可以在循环中记录link['attribs']['href'],您将看到arr将首先作为空数组[]打印,然后循环中的值将被打印。