从作为参数传递的匿名函数返回

时间:2012-11-02 04:40:08

标签: 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) {
            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

2 个答案:

答案 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可用的函数调用的回调参数,以便可以异步提供给调用者。