从匿名函数返回作为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地提供给调用者。