【问题标题】:How come a globally defined array that gets data pushed to it with in a callback function is empty in the global scope?在回调函数中获取数据推送给它的全局定义数组为什么在全局范围内是空的?
【发布时间】:2013-09-19 21:57:11
【问题描述】:

我将一个空数组分配给全局变量artistURLs。然后,我使用 Cheerio .each() 迭代器方法将字符串(局部变量 artistURL)推送到 artistURLs 数组中。

var request = require('request'),
  cheerio = require('cheerio'),
  url = 'http://www.primarytalent.com/',
  artistURLs = [];

request(url, function(err, resp, body){
  if(err)
    throw err;
  $ = cheerio.load(body);
  $('#rosterlists div li a').each(function(){
    var urlCap = this.attr('href').slice(1);
    var artistURL = url.concat(urlCap);
    artistURLs.push(artistURL);
  });
  console.log(artistURLs);
});

我知道artistURL 被成功推送到artistURLs 因为

console.log(artistURLs);

将在我的终端中显示填充的数组。问题是如果我尝试在全局范围内的回调函数之外运行console.log(artistURLs);。例如

var request = require('request'),
  cheerio = require('cheerio'),
  url = 'http://www.primarytalent.com/',
  artistURLs = [];

request(url, function(err, resp, body){
  if(err)
    throw err;
  $ = cheerio.load(body);
  $('#rosterlists div li a').each(function(){
    var urlCap = this.attr('href').slice(1);
    var artistURL = url.concat(urlCap);
    artistURLs.push(artistURL);
  });
});

console.log(artistURLs);

所以您可以看到我已将console.log(artistURLs); 移出request()。出于某种原因,尝试在全局范围内访问 artistURLs 会返回一个空数组,就好像在 `request()~ 中发生的所有处理都没有发生过一样。

这是怎么发生的?如何确保所有被推送到artistURLs 的网址都保留在artistURLs 中?

谢谢

【问题讨论】:

标签: javascript node.js request cheerio


【解决方案1】:

request() 模块是异步的,因此当您使用console.log() 时,console.log() 在 HTTP 调用完成之前执行。比如下面这段代码:

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

request(url, function(err, resp, body){
  if (err)
    throw err;
  $ = cheerio.load(body);
  $('#rosterlists div li a').each(function(){
    var urlCap = this.attr('href').slice(1);
    var artistURL = url.concat(urlCap);
    artistURLs.push(artistURL);
    console.log('push');
  });
});

console.log(artistURLs);

你会看到这个结果:

[]
push
push
...
push
push
push

为防止这种情况发生,请仅在 HTTP 请求回调中使用变量 artistURLs

【讨论】:

  • 啊,我明白了。所以我想我的问题应该是“我怎样才能将artistURLs 返回到全球范围内?
  • 这里的问题是artistURLs 已经进入了全局分数,只是您在将任何数据推送到该数组之前访问它。除非 HTTP 请求是同步的,否则无法按照您的要求进行操作。
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 2019-03-31
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多