上次发问了有关于callback的问题 了解到该做的事情还是要放在callback里面 但在mysql查询上 还是遇到了一些问题 如果我有一个devicelist 纪录所存在的装置名称 每个装置名称都是一个table 如device001,device002,device003 我的作法如下 q_s = "SELECT * FROM devicelist"; connection.query(q_s,function(err,rows,fields){ if(err) throw err; for (i in rows){ connection.query("SELECT * FROM"+rows[i].TableName,function(err,rows1,fields){ //What to do }); } console.log(rows[0].TableName); });
我寫了一個for 去抓list中的所有device名稱 然後在執行一個sql query 但如果我要對每一個device的值做比較要怎麼做? 我不知道我有没有表达我的意思有问题的话都可以问我 感谢解答 node js的callback真的让我很苦恼跟python比起来
callback是基础,可恼也没办法。理解了callback以后可以试试Promise,绝对爽~但,我是callbacker~
q_s = "SELECT * FROM devicelist";
connection.query(q_s,function(err,rows,fields){
if(err)
throw err;
async.map(rows, function(row, cb){
connection.query("SELECT * FROM"+row.TableName,function(err,data,fields){
//sth. to do
cb(err, data);//此处的data是你想返回的数据
});
}, function(err, result){
//result是上面每一个data组成的数组,这里所有数据都已经拿到,想做什么比较随便你~
});
});
@DevinXian 感谢回应
但我还是有一些地方不懂 您最后得出来的result 是不是在离开最一开始的query就不见了呢 如果我外面有一些值想跟result 做比较该怎么办
根据以前的观念 都是用一个变数去接return 值 我不太清楚 nodejs的正确写法 是应该把所有的事情都在callback中做完 那这样不会太多层吗?
另外再问一下这边要怎么把code像你的回应一样包起来方便其他人阅读
最后 感谢回应
callback就是异步,是不允许在外面做callback返回值的处理的,只能在回调方法内处理,要理解什么是异步,callback就很简单了, 以后你会爱上callback的 async.series([ function(cb){ query(rows,fields, function(e, r){ //在此对r(查询结果)做处理,若想在下后面的代码使用可以定义一个外围变量,或者使用async.waterfall cb() }) } ], function(err, result){ console.log(err, result); });
//对query函数做简单的封装
db.query = function(cursor,query,cb) {
connection.query(query, function(err, result) {
if (err) return cb(err);
cb(null, result, cursor);
}
}
//用forEach 遍历查询
list.forEach(function(item, index) {
db.query(index, 'query with item and index', callback);
function callback(err, result, cursor) {
//deal with result and cursor
}
});