2

サーバーサイド JavaScript の素晴らしい世界に足を踏み入れたばかりで、まだ非同期処理のコツをつかんでいます。ノード プロジェクトをいじった後、この JavaScript が私の過去のガールフレンドの多くに似ていることに気付きました。とにかく、誰かが私を助けてくれることを望んでいました...以下に説明付きのコードがあります:

//this is the function I'm calling to
function queryDb(connection, sql){
  connect(connection, function(){
        connection.query(sql, function(err, results){
                if(!err){
                  return results;
                  end(connection);
                }
                else{
                  throw err;
                }
    });

  });
}

そして、ここで私は電話をかけます。呼び出しの後、いくつかのコードを実行したいのですが、この関数の処理が完了するまでは実行しません (実際にはデータベースへのクエリであるため、少し時間がかかり、js は処理を続けます)。

var queryResults = db.queryDb(db.connection, "SELECT * FROM Clients");
    if(queryResults){
         console.log(queryResults);
         req.dbResults = queryResults;
         next();
     }
     else{
         console.log('The query results where not returned here is the queryResults variable: ' + queryResults);
     }

私が望んでいるのは、親関数から返される結果と、その結果に対して何かを行う子関数によって実行されるコールバックです。私はこれを試しました:

 queryDb(db.connection, "SELECT * FROM Clients", function(){
    if(results){
       console.log(results);
       req.dbResults = results;
       next();
    }
    else{
       console.log('The query results where not returned here is the queryResults variable: ' + results);
    }
 });

しかし、「呼び出し関数」のコールバックで、親関数によって返された結果にアクセスできません。

4

1 に答える 1

0
function queryDb(connection, sql){  <--2 arguments

queryDb(db.connection, "SELECT * FROM Clients", function(){ <-- passing 3

3 番目の引数で何もしていないため、コールバックは呼び出されません。

最後の例では、呼び出しは非同期であるため、実行しようとしていることが機能しません。

そして、その謎の 3 パラメータで動作するようにコードを修正します。

function queryDb(connection, sql, callback) {
    connect(connection, function () {
        connection.query(sql, function (err, results) {
            if (!err) {
                callback(results);
                end(connection);
            } else {
                throw err;
            }
        });

    });
}
于 2012-12-14T21:53:18.477 に答える