4

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

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()~ 中发生的所有处理都没有发生过一样。

这是怎么发生的,如何确保所有被推送的 url 都artistURLs保留在url 中artistURLs

谢谢

4

1 回答 1

1

request()模块是异步的,因此console.log()在您使用console.log(). 例如,使用以下代码:

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

为防止这种情况发生,请仅使用artistURLsHTTP 请求回调内部的变量。

于 2013-09-20T02:02:31.150 回答