从匿名函数返回作为parameter passing
考虑下面的代码:
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()
时,我想要从内部匿名函数返回results
,我得到了不同的输出,这看起来像是在使用中的一些内部构造的mysql库。
如何获取dbTask在调用时返回results
?
由于mysql.query
是asynchronous的,所以你必须重新考虑你的架构。
而不是让你的函数返回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) { /* ... */ });
你不能因为一旦mysql.query
调用完成来启动查询, mysql.query
dbTask
返回。 所以在调用mysql.query
的callback函数的时候, console.log(r)
已经被执行了。
这是node.jsasynchronous性质的关键。
你可以做的是让dbTask
接受一个callback参数,一旦results
可用,函数就会调用这个参数,这样它就可以asynchronous地提供给调用者。