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