Javascript node.js中的异步循环

Javascript node.js中的异步循环,javascript,mysql,sql,node.js,asynchronous,Javascript,Mysql,Sql,Node.js,Asynchronous,我是node.js的新手,在经历了大量的吹毛求疵之后,我意识到我的问题似乎是node在执行我的代码时没有顺序。所以我试着在node中研究异步,这让我更加困惑。这是我的密码: var cheerio = require('cheerio'); var request = require('request'); var data = []; var mysql = require('mysql'); var async = require('async'); var seasonStart = ne

我是node.js的新手,在经历了大量的吹毛求疵之后,我意识到我的问题似乎是node在执行我的代码时没有顺序。所以我试着在node中研究异步,这让我更加困惑。这是我的密码:

var cheerio = require('cheerio');
var request = require('request');
var data = [];
var mysql = require('mysql');
var async = require('async');
var seasonStart = new Date(2014, 9, 28);

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'blahblah',
    database: 'testDB',
    port: 3306 });

connection.connect();

//loop through every day since the season started
for (d = seasonStart; d <= Date.now(); d.setDate(d.getDate() + 1)){
    request('http://www.basketball-reference.com/friv/dailyleaders.cgi?month='+(d.getMonth()+1)+'&day='+d.getDate()+'&year='+d.getFullYear(), 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);
            });



            //loop through the game logs for the day
            for(i=1;i<data.length;i+=26){
                var selectPlayer = connection.query(
                "SELECT * FROM player WHERE name = '"+data[i].replace("'","")+"'",
                (function(i) {
                    return function(err, result, fields) {
                        if (err) throw err;
                        //If there is a player that doesnt exist yet, add him.
                        if(result.length==0){
                            var insertPlayer = connection.query(
                                'INSERT INTO player (provider_id, team_id, position_id, name) VALUES (1, (SELECT id FROM team WHERE slug = "'+data[i+1]+'"),1,"'+data[i].replace("'","")+'");',function(err,result,fields){
                                }
                            );
                        }
                        /* var insertGame = connection.query(
                            "INSERT INTO game (provider_id, date_played, home_id, away_id) VALUES (1, "+d.getFullYear()+"/"+d.getMonth()+"/"+d.getDate()+", "+data[i+1]+", "+data[i+3]+");",function(err,result,fields){
                            }
                        ); */
                    };
                })(i));
            }
        }
    });
    console.log(d.getFullYear(),'/',(d.getMonth()+1),'/',d.getDate());
}



//connection.end();
当此代码没有等待INSERT查询在继续之前执行时,就会出现问题。我试着教自己回调之类的东西,但我很难把我的头绕在它上面。如果我能弄清楚它在说什么,我认为这是一个描述我问题解决方案的页面:

我可能需要一些帮助将其应用到我的代码中,以便我能够理解这个概念。

类似于:

var cheerio = require('cheerio');
var request = require('request');
var mysql = require('mysql');
var async = require('async');

var days = [];
var data = [];
var seasonStart = new Date(2014, 9, 28);
var baseUrl = 'http://www.basketball-reference.com/friv/dailyleaders.cgi?'

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'blahblah',
    database: 'testDB',
    port: 3306 });

connection.connect();

//loop through every day since the season started
for (var d = seasonStart; d <= Date.now(); d.setDate(d.getDate() + 1)){
    days.push('month='+(d.getMonth()+1)+'&day='+d.getDate()+'&year='+d.getFullYear());
}

async.series([
    function getRemoteData (cb) {
        async.each(days, function (day, cb) {
            request(baseUrl + day, function parseData (err, response, body) {
                if (err) {
                    cb(err);
                } else if (response.statusCode !== 200) {
                    cb(new Error('bad response'));
                } else {
                    var $ = cheerio.load(body);
                    $('td', 'tbody').each(function(){
                        var url = $(this).attr('href');
                        var text = $(this).text();
                        data.push(text);
                    });
                    cb();
                }
            });
        }, cb);
    },
    function getLocalData (cb) {
        async.each(data, function (dataPoint, cb) {
            connection.query("SELECT * FROM player WHERE name = '" + dataPoint.replace("'","") + "'", function (err, result, fields) {
                if (err) {
                    cb(err);
                } else {
                    //not sure what you're doing in this part, cb when you're done
                    cb();
                }
            });
        }, cb);
    }
}, function (err) {
  if (err) {
    throw err;
  } else {
    console.log('YAY DATA');
    console.log(data);
  }
});