1

考虑以下代码:

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 库的一些内部构造。

如何让 dbTaskresults在调用时返回?

4

2 回答 2

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) { /* ... */ });
于 2012-11-02T04:43:34.467 回答
2

您不能因为调用完成后dbTask返回mysql.query以启动查询。所以到 timemysql.query的回调被调用时,console.log(r)已经执行了。

这是 node.js 的异步特性的症结所在。

可以做的是dbTask接受一个回调参数,该函数调用一次results可用,以便可以异步提供给调用者。

于 2012-11-02T04:43:52.130 回答