connection.query(login_user_device+deviceid,
function selectCb(err, results, fields) {
if (err) {
throw err;
}else{
connection.query('SELECT * FROM cash_user WHERE uid='+results[0].uid+'',
function selectCb(err, resultss, fields) {
if (err) {
throw err;
}else{
connection.query("SELECT * FROM cash_daily_coin WHERE uid_fk="+results[0].uid+"",
function selectCb(err, daily, fields) {
if (err) {
throw err;
}else{
var datas = resultss[0];
datas.deviceid = deviceid;
datas.todaycoin = daily[0].todaycoin;
req.session["user"] = datas;
res.jsonp(datas);//返回JSON
}
}
);
}
}
);
}
}
);
首先我觉的你代码需要格式化一下。然后这种嵌套问题你可以看一下async和bluebird的文档都是解决嵌套的,比如async的waterfall方法
async.waterfall([
function(callback){
conn.query('sql语句',function(err,results){
callback(err, results);
});
},function(data,callback) {
conn.query('sql语句',function(err,results){
callback(err,data,results)
});
}
], function (err,data,data2) {
if(err) {
console.log(err);
}else {
//todo
}
});
死月注:你的代码好像也没格式化啊。
eventproxy
首先,LZ要把代码缩进一下啊,要不别人怎么帮你看。
第二,从大意上看,你需要了解一下async或者Promise,Node.js是异步的,处理这些SQL也是异步的。而一般大家的逻辑思维和业务流程是同步的,所以你可能需要类似这样的东西。
第三,按照你的问题的思路回答,彻底解决嵌套问题,是做不了的,即:
// 先做第一个sql
var query1 = connection.query(sql1);
var result1 = doSth(query1);
// 再做第二个sql
var query2 = connection.query(sql2);
var result2 = doSth(query2);
上面这种想法和思路是同步思维,在Node里面做不了,你需要研究一下async类似的这种方式。至于异步到底适不适合做同步的流程,已经老生常谈的话题。
1、generator,promise,co(es6) 2、bluebird,thunkify(es5) 3、async await(es7)
@alsotang 突然发现没法编辑他的帖子了 0. 0
你们都曲线救国么
function once(sql,cb){
pool.getConnection(function(err,con){
if(err){throw err};
con.query(sql,function(err,result){
con.release();
if(err){throw err}
cb(result)
})
})
}
once(sql,function(result1){
once(sql2,function(result2){
theEnd()
})
})
function theEnd(){
//balabala
}
你们这帮人,一回答问题就是一堆三方库,让别人怎么学原理。
@xadillax 现在好了~上次忘记加了 sorry。。。
@mcc285361464 谢谢,已经使用async
@echoloyuk 迟来的感谢,已通过async解决。
@wfsovereign 迟来的感谢,已通过async解决。
@MiguelValentine 迟来的感谢,已通过async解决。