我将一个空数组分配给全局变量 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
的 url 都保留在 artistURLs
中?
谢谢
最佳答案
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
。
关于javascript - 为什么一个全局定义的数组在回调函数中将数据推送给它在全局范围内是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18905605/