繁体   English   中英

node.js中的异步循环

[英]Asynchronous loop in node.js

我是node.js的新手,经过大量的故障排除后,我意识到我的问题似乎是节点执行我的代码的方式不是顺序的。 所以我尝试研究节点中的异步,这让我更加困惑。 这是我的代码:

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查询执行时,就会出现问题。 我正在尝试教自己回调等等,但是我很难解决这个问题。 如果可以弄清问题所在,请在以下页面上介绍我的问题的解决方法: http : //justinklemm.com/node-js-async-tutorial/

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

就像是:

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);
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM