、あなたは非同期関数から「リターン」であり主に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(非同期のものをたくさん連ねるのに非常に適しています)に関しては、もっと多くのことができます。これらのオプションの両方をさらに研究することをお勧めします。
[非同期呼び出しからの応答を返すにはどうすればよいですか?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-電話) –
ありがとう!それは私が勉強中に行ったページの1つです。もう少しありますが、私はロジックを実装し、共有コードで目標を達成するのに苦労しています。 – Ben77