请考虑以下代码:
function dbTask(q) {
mysql = new MySQL();
mysql.host = sqlHost;
mysql.user = sqlUser;
mysql.password = sqlPassword;
mysql.query("USE stock");
return mysql.query(q, function(err, results, fields) {
if(err) {
console.log("MySQL Error: " + err + ", Query: " + q);
return false;
} else {
return results; //here
}
});
};
var r = dbTask("SELECT * FROM user;");
console.log(r);
然而,我希望在最后一行调用results
时从内部匿名函数返回dbTask()
,我得到不同的输出,这看起来像是mysql库的一些内部构造使用
如何让dbTask在调用时返回results
?
答案 0 :(得分:4)
由于mysql.query
是异步的,因此您必须重新考虑您的架构。
如果查询返回true或false,则必须传入处理程序,而不是使函数返回true或false。
这样的事情:
function dbTask(q, success, failure) {
mysql = new MySQL();
mysql.host = sqlHost;
mysql.user = sqlUser;
mysql.password = sqlPassword;
mysql.query("USE stock");
mysql.query(q, function(err, results, fields) {
if(err) {
console.log("MySQL Error: " + err + ", Query: " + q);
failure(err, results, fields);
} else {
success(results, fields);
}
});
};
您可以这样称呼:
dbTask(q,
function(results, fields) { /* ... */ },
function(err, results, fields) { /* ... */ });
答案 1 :(得分:2)
您不能因为dbTask
调用完成后mysql.query
返回以启动查询。因此,当调用mysql.query
的回调时,console.log(r)
已经执行。
这是node.js的异步性质的关键。
可以做的是dbTask
接受一个results
可用的函数调用的回调参数,以便可以异步提供给调用者。