【发布时间】: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