我有一个网址列表,大概有4个。对于每个变量,我都想收集一些信息并将其存储到一个名为allData的全局变量中。所以我的代码看起来像这样:
var request = require('request');
var cheerio = require('cheerio');
var urls = [url1,url2,url3,url4];
var allData = [];
for(var url in urls){
request(url, function(err,response,body){
var $ = cheerio.load(body);
var data = $('h1.large','#title_main').text();
allData.push(data);
});
}然而,我意识到由于使用request的异步特性,这将不会起作用。在最后一个循环中,"datas“中的所有数据都是相同的,并且都来自url4。你知道我怎么解决这个问题吗?真的需要这个功能。
发布于 2017-04-29 04:27:46
很高兴你找到了一个适合你的解决方案。
9个月过去了,您可能已经知道了这一点,但是为了将来的参考,您还可以使用一些原生的javascript Array函数来“关闭”每次迭代的作用域(并避免对您的项目产生另一个依赖项) --我在我的一些使用.forEach()的internet抓取器中总是这样做
urls.forEach(function(url){
request(url, function(err,response,body){
var $ = cheerio.load(body);
var data = $('h1.large','#title_main').text();
allData.push(data);
});
})Array.prototype中有一些基于函数式编程的方法,它们允许您对数组中数据的每次迭代(实质上是冻结进入函数的参数)执行函数。有几个像.forEach()这样的函数允许您关闭包含异步代码的循环中的参数。
上面的代码导致四个方法异步执行。每个方法都被传递给数组中的一个url。当每个请求完成时,allData将从requests/cheerio解析的内容中追加结果。
如果您需要它们按顺序排列,您可以访问随每个forEach函数迭代一起传递的index:
urls.forEach(function(url,index){
request(url, function(err,response,body){
var $ = cheerio.load(body);
var data = $('h1.large','#title_main').text();
allData[index]=data;
});
})https://stackoverflow.com/questions/38492703
复制相似问题