Javascript node.js中的异步循环
我是node.js的新手,在经历了大量的吹毛求疵之后,我意识到我的问题似乎是node在执行我的代码时没有顺序。所以我试着在node中研究异步,这让我更加困惑。这是我的密码: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
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);
}
});