2017-05-22 7 views
0

私はNodeを初めて使い、コールバックの概念を明確に悩ましています。クエリが完了した後にのみ配列を返すにはどうすればよいですか?私は、MSSQLモジュールの例と同様のノードを見てきましたが、私はDB操作によるコールバックニュアンス

function myFunction() { 
 
    var arr = []; 
 
    var connection = new sql.Connection(dbConfig, function (err) { 
 
     var request = new sql.Request(connection); 
 

 
     request.query('select top 10 Name from User', function (err, recordset) { 
 
      if (err) { 
 
       console.log('error'); 
 
      } 
 

 
      for (var id in recordset) { 
 
       arr.push(recordset[id]["Name"]); 
 
      } 
 
      
 
     }); 
 

 
    }); 
 
}; 
 

 
myFunction();

は結局、私は私が使用することができます「リターン」配列やJSON形式の結果セットをしたい私の問題解決失敗しましたそれは簡単です。ノードで

+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-電話) –

+0

ありがとう!それは私が勉強中に行ったページの1つです。もう少しありますが、私はロジックを実装し、共有コードで目標を達成するのに苦労しています。 – Ben77

答えて

0

、あなたは非同期関数から「リターン」であり主に2つ(だけでなく!)方法:request.queryをパラメータとしてコールバックを取る方法と同様に

コールバック

、あなたはまた、そうすることができます:私は、他のノードのコールバックと同じ規則に続いてきたか

function myFunction(cb) { 
    var arr = []; 
    var connection = new sql.Connection(dbConfig, function (err) { 
     var request = new sql.Request(connection); 

     request.query('select top 10 Name from User', function (err, recordset) { 
      if (err) { 
       console.log('error'); 
       cb(err, null); 
       return; 
      } 

      for (var id in recordset) { 
       arr.push(recordset[id]["Name"]); 
      } 

      cb(null, arr); 
     }); 

    }); 
}; 

お知らせ - 2番目のパラメータとして最初のパラメータなどのエラー、返されたデータを。代わりにこれを使用すると、そのようなあなたの機能を使用することができます。

myFunction(function (err, data) { 
    if (err) { 
     /* error handling */ 
    } 

    /* do stuff with data here */ 
}); 

約束

非同期周りにややより近代的な抽象化が約束され - これらは、オブジェクトとして起こるしようとしている非同期の事を表しています解決されるか拒否されます。ここでは、あなたの関数にこのパターンを適用できる方法は次のとおりです。

function myFunction() { 
    return new Promise(function (resolve, reject) { 
     var arr = []; 
     var connection = new sql.Connection(dbConfig, function (err) { 
      var request = new sql.Request(connection); 

      request.query('select top 10 Name from User', function (err, recordset) { 
       if (err) { 
        console.log('error'); 
        reject(err); 
        return; 
       } 

       for (var id in recordset) { 
        arr.push(recordset[id]["Name"]); 
       } 

       resolve(arr); 
      }); 
     }); 
    }); 
}; 

あなたはすることができますし、結果を処理するために、返された約束の上にチェーン.then.catch

これらの例の
myFunction() 
    .then(function (data) { 
     /* ... */ 
    }) 
    .catch(function (err) { 
     /* ... */ 
    }); 

はどちらも非常に基本的なもの - があります特にPromises(非同期のものをたくさん連ねるのに非常に適しています)に関しては、もっと多くのことができます。これらのオプションの両方をさらに研究することをお勧めします。

+0

ありがとうジョー。しかし、私はDB機能の外から人口の配列を読み取るためにまだ苦労しています。あなたは親切にそれを追加して、私は完全な画像を見ることができますか?私はMVC構造に従うことを試みているので、関数とモジュール自体の中から結果セットを引き出す必要があります。 – Ben77

+0

@ Ben77:移植された配列は、コールバック/ 'then'ハンドラの' data'パラメータです。そのハンドラを介してアクセスする必要があります。非同期操作が最初に完了したことを保証する唯一の方法です。 –

+1

ありがとう!私はコールバックと約束についてもっと読んだりリサーチしたりするつもりです。 – Ben77

関連する問題