javascript - for 循环内的变量给出最大值

标签 javascript mysql node.js for-loop cheerio

编辑:使用完整代码进行更新。

我正在 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/

相关文章:

javascript - 将 Javascript 数组值放入 M​​ongodb 集合值中

javascript - 在 Chrome/Firefox 上重复设置 HTML5 视频 currentTime 是紧张的,但不是 Safari

php - AVG mysql php错误: mysql_fetch_array() expects parameter 1 to be resourc

javascript - browserify 排除找不到模块

javascript - 将 Select2 数组输出转换为字符串

javascript - 如何在Node.js中声明和使用map/dictionary?

javascript - NodeJS 的递归 Promise 不会终止

node.js - Node JS : How to decode base64 encoded string back to binary?

javascript - 我们如何将 unix 时间戳中的时间转换为 MySQL 中基数为 32 的字符串

php - 登录系统,禁止用户php