[英]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.