javascript - 为什么一个全局定义的数组在回调函数中将数据推送给它在全局范围内是空的?

标签 javascript node.js request cheerio

我将一个空数组分配给全局变量 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/

相关文章:

javascript - 球被困在 Racket 内

node.js - 我如何使用axios和cheerio实现多页面抓取

node.js - 全局 NPM 包安装的简单 CircleCI 2.0 配置失败

c# - 如何拦截WCF Web方法请求?

android - 每次我发出 http 请求时,应用程序都会崩溃

ios - 应用程序被杀死时如何请求数据?

javascript - 在按钮单击时调用功能组件以使用react

php - adsense服务器端

javascript - jQuery - 可调整宽高比仅适用于一个 handle

node.js - 从 mongodb 检索图像并使用 angular7 显示它