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一方、最後から2番目の行で呼び出すときに内部の匿名関数から返されるようにしたいのですが、dbTask()使用中のmysqlライブラリの内部構造のように見える別の出力を取得しています。

呼び出されたときに dbTask を返すにはどうすればよいresultsですか?

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したがって、mysql.queryのコールバックが呼び出されるまでに、console.log(r)はすでに実行されています。

これは、node.js の非同期の性質の核心です。

できることdbTask、関数が一度呼び出すコールバック パラメーターを受け入れてresults、呼び出し元に非同期的に提供できるようにすることです。

于 2012-11-02T04:43:52.130 に答える