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

我将一个空数组赋给全局变量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成功地被推入了artistURL,因为

的console.log(artistURLs);

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

var request = require('request'),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);在请求之外().出于某种原因,尝试在全局范围内访问artistURL会返回一个空数组,就好像在`request()〜中发生的所有处理都没有发生过一样.

为什么会发生这种情况,以及如何确保所有被推入artistURL的网址都保留在artistURL中?

谢谢

解决方法

request()模块是异步的,因此当您使用console.log()时,在HTTP调用完成之前,console.log()正在执行.例如,请使用以下代码

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

request(url,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请求回调中的变量artistURL.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...