我刚刚涉足服务器端javascript的奇妙世界,并且仍然不理解异步处理。在弄乱了一个节点项目之后,我意识到这个javascript就像我以前的许多女朋友一样-他们只是不会回叫。无论如何,我一直希望有人能帮助我...下面是带有解释的代码:
//this is the function I'm calling to
function queryDb(connection, sql){
connect(connection, function(){
connection.query(sql, function(err, results){
if(!err){
return results;
end(connection);
}
else{
throw err;
}
});
});
}
这是我打电话的地方。调用之后,我希望执行一些代码,但是要等到该函数完成处理后才能执行(它实际上是对数据库的查询,因此需要更长的时间,并且我的js会继续运行)。
var queryResults = db.queryDb(db.connection, "SELECT * FROM Clients");
if(queryResults){
console.log(queryResults);
req.dbResults = queryResults;
next();
}
else{
console.log('The query results where not returned here is the queryResults variable: ' + queryResults);
}
我想发生的事情是从父函数返回结果,然后由子函数运行一个对结果做一些事情的回调。我尝试了这个:
queryDb(db.connection, "SELECT * FROM Clients", function(){
if(results){
console.log(results);
req.dbResults = results;
next();
}
else{
console.log('The query results where not returned here is the queryResults variable: ' + results);
}
});
但是我无法在“调用函数”的回调中访问父函数返回的结果。
最佳答案
function queryDb(connection, sql){ <--2 arguments
queryDb(db.connection, "SELECT * FROM Clients", function(){ <-- passing 3
您没有对第三个参数做任何事情,因此不会调用您的回调。
在最后一个示例中,该调用是异步的,因此您尝试执行的操作将无法正常进行。
并修复代码以使用该神秘3参数。
function queryDb(connection, sql, callback) {
connect(connection, function () {
connection.query(sql, function (err, results) {
if (!err) {
callback(results);
end(connection);
} else {
throw err;
}
});
});
}