Javascript 从作为参数传递的匿名函数返回
考虑以下代码:Javascript 从作为参数传递的匿名函数返回,javascript,node.js,anonymous-function,Javascript,Node.js,Anonymous Function,考虑以下代码: 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) {
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);
然而,我希望在最后第二行调用dbTask时从内部匿名函数返回结果,我得到了不同的输出,这似乎是正在使用的mysql库的一些内部构造
如何让dbTask在调用时返回结果?因为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) { /* ... */ });
你可以这样称呼它:
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) { /* ... */ });
因为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) { /* ... */ });
你可以这样称呼它:
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) { /* ... */ });
不能这样做,因为一旦mysql.query调用完成,dbTask就会返回以启动查询。因此,在调用mysql.query的回调时,console.logr已经执行
这是node.js异步特性的关键
您可以让dbTask接受一个回调参数,一旦结果可用,函数就会调用该参数,以便异步地将其提供给调用方。您不能接受,因为dbTask在mysql.query调用完成后返回以启动查询。因此,在调用mysql.query的回调时,console.logr已经执行
这是node.js异步特性的关键
您可以做的是让dbTask接受一个回调参数,一旦结果可用,函数就会调用该参数,以便可以异步地将其提供给调用方