JavaScript 范围/代码迭代不同步
JavaScript scope/code iteration out of sync
我正在尝试创建一个工具来从网页上抓取信息(是的,我有权限)。
到目前为止,我一直在使用 Node.js 与请求和欢呼来拉取页面,然后根据 CSS 选择器查找信息。我已经做了足够的调试,知道脚本肯定成功地从页面中获取信息。
似乎正在发生的事情是,for循环后的代码首先执行,或者在调用和请求无法完成后执行得太快。我不完全确定 JS 调用堆栈是如何工作的。
我的源代码如下所示:
var baseURL = 'http://www2.dailyfaceoff.com/teams/lines/';
var request = require('request'),
cheerio = require('cheerio'),
urls = [],
teams = [];
var teamPages = [13, 14, 15, 16, 17, 18, 19, 20, 21,
21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
35, 36, 37, 38, 39, 40, 41, 42]
for(i in teamPages)
{
url = baseURL + teamPages[i];
urls.push(url);
}
for(u in urls)
{
var team = [];
request(urls[u], function(err, resp, body)
{
if(!err && resp.statusCode == 200){
var $ = cheerio.load(body);
var teamName = $('#newTitle').text();
var players = [];
$('#forwards td a img').each(function(){
var name = $(this).attr("alt");
players.push(name); });
$('#defense td a img').each(function(){
var name = $(this).attr("alt");
players.push(name); });
$('#goalie_list td a img').each(function(){
var name = $(this).attr("alt");
players.push(name); });
//console.log(players);
teams.push(players);
}
});
}
console.log(teams);
console.log('DONE');
Node.js 似乎有些奇怪,它基于事件驱动的非阻塞模型。因此,在异步调用中使用循环块(如for
)时需要小心。尝试使用 forEach
并为其提供函数处理程序。此外,仅当您确定所有请求都已满足时,才打印结果。下面的代码可能会对您有所帮助,但它仍然不是 100% 正确/漂亮:
urls.forEach( function (url, index) {
var team = [];
request(u, function(err, resp, body)
{
if(!err && resp.statusCode == 200){
.
.
teams.push(players);
// Print the teams when last response is done
if ( index == urls.length - 1 )
console.log(teams);
}
});
}
相关文章:
- 如何在javascript中迭代数字列表
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 如何迭代Array.prototype函数
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 在ejs-partial中对JSON对象进行迭代
- 如何在DataTables 2.1中迭代对象数组
- 使用递归属性迭代保留属性结构
- 正在停止.在jquery中的特定时间间隔内,每次迭代的每次执行
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- 主干-从模板中迭代的集合中获取特定的模型
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 什么's是在javascript中迭代项的最佳方式
- 为什么这只是迭代 HTMLCollection 的奇怪元素
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- Babel编译错误:找不到模块核心js/library/fn/get迭代器
- 在es6中,将带有回调的事件侦听器设置为可迭代的
- JavaScript 范围/代码迭代不同步
- 对一个巨大的数组进行并行或同步迭代会更快吗?
- 如何在循环中同步运行AJAX(在下一次迭代之前阻塞)
- Node.js同步循环或迭代异步语句