编辑:使用完整代码进行更新。
我正在 node.js 中编写 JavaScript 代码,该代码旨在循环遍历我从网络上抓取的数据数组。代码的目的是:
1) 检查玩家表,看看该玩家的名字是否存在于记录中,并且 2) 如果该玩家不存在,则将其添加到数据库中。
这是我的代码:
var cheerio = require('cheerio');
var request = require('request');
var data = [];
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'blahblah',
database: 'test',
port: 3306 });
connection.connect();
request('http://www.basketball-reference.com/friv/dailyleaders.cgi?month=12&day=28&year=2014', function(err, response, body){
if(!err && response.statusCode ==200){
var $ = cheerio.load(body);
$('td', 'tbody').each(function(){
var url = $(this).attr('href');
var text = $(this).text();
data.push(text);
});
for(i=1;i<data.length;i+=26){
var query = connection.query(
"SELECT * FROM player WHERE name = '"+data[i]+"'",function(err, result, fields) {
if (err) throw err;
if(result.length==0){
//var insertQuery = "INSERT INTO player (provider_id, team_id, position_id, name) VALUES (1, (SELECT id FROM team WHERE slug = '"+data[i+1]+"'),1,'"+data[i]+"');";
console.log(i);
}
});
}
}
});
请注意,出于测试目的,我注释掉了 INSERT 查询,但球员姓名位于 data[i] 中,而球队名称位于 data[i+1] 中。
为了测试,我只是将 i 打印到控制台,每个循环都会打印出 i 的最大值,即 3225。但是,console.log 命令位于 for 循环内部,因此不应打印i 递增时的每个值?
最佳答案
这类似于这个问题:JavaScript closure inside loops – simple practical example
这个答案解释了为什么事情会这样。
如果您在回调中引用变量并且该变量在执行回调之前已经达到该最大值,则这种情况会在闭包中发生。
这是您的代码正在执行的操作的示例(回调不好):
function a(){
var i = 0;
var callbacks = [];
for (i=0;i<100;i+=25){
callbacks.push(function(){
alert(i);
});
}
return callbacks;
}
var callbackArray = a();
for( f in callbackArray){
callbackArray[f]();
}
这是它应该做的事情:
function createFunction(i){
return function(){
alert(i);
}
}
function a(){
var i = 0;
var callbacks = [];
for (i=0;i<100;i+=25){
callbacks.push(createFunction(i));
}
return callbacks;
}
var callbackArray = a();
for( f in callbackArray){
callbackArray[f]();
}
为了修复您的问题,您应该执行以下操作:
// outside of the code you posted, as a separate function.
function createPlayerSelectionCallback(data,i){
return function(err, result, fields) {
if (err) throw err;
if(result.length==0){
//var insertQuery = "INSERT INTO player (provider_id, team_id, position_id, name) VALUES (1, (SELECT id FROM team WHERE slug = '"+data[i+1]+"'),1,'"+data[i]+"');";
console.log(i);
}
}
}
// this for loop stays in the same place, just modified to use the new function.
for(i=1;i<data.length;i+=26){
var query = connection.query(
"SELECT * FROM player WHERE name = '"+data[i]+"'",createPlayerSelectionCallback(data, i))
}
关于javascript - for 循环内的变量给出最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27699710/