关于async及callback还是有不懂的地方
发布于 9 年前 作者 leesin11 4527 次浏览 最后一次编辑是 8 年前 来自 问答

上次发问了有关于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比起来

8 回复

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

@leesin11 找CNode读取数据库代码看看。不会模仿代码的码农不是努力的工程师~

@DevinXian 亲,貌似你的代码有错哟,是cb(err,data),不是callback(err,data)哟

http://www.jianshu.com/p/36bf1a598d85 可以看看这片分享,理解一下async

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

@fantasticsoul 是的,已经更正,多谢指出

回到顶部