さまざまなdb呼び出しを処理するために、ノードモジュールを記述しようとしています。可能な限りasync/awaitを使用したいのですが、いくつか問題があります。
私はプロミスを少し使っており、それらの関数をうまくエクスポートしています。例:
function GetUsernames() {
return new Promise(function (resolve, reject) {
sql.connect(config).then(function () {
new sql.Request()
.query("SELECT [UserName] FROM [Users] ORDER BY [LastLogin] ASC").then(function (recordset) {
resolve(recordset);
}).catch(function (err) {
reject(err);
});
});
});
}
そして、私は以下でエクスポートします:
module.exports = {
GetUsernames: GetUsernames,
GetScopes: GetScopes,
UpdateToken: UpdateToken,
SetOwner: SetOwner
};
しかし、node7で使用可能なasync/awaitを使用するには、非同期関数を使用してこれをどのように行う必要がありますか?
私はまだ約束を返すだけですか?私はそれを試みました、しかしそれから私のコードでそれを呼ぶとき、それは働きません。
const db = require("dataprovider");
...
var result = await db.GetUsernames();
それは私に与えます:
SyntaxError:予期しない識別子
データベース名に(then()でpromise関数を使用するだけで問題なく動作します。)
たぶん私のグーグルスキルはひどいかもしれませんが、私はこの問題について、私が使用できるものをグーグルで管理することができませんでした。
私のモジュールで、他の場所で待機できる非同期関数をどのように作成しますか?
Awaitキーワードをオンにするには、非同期関数内に含める必要があります。
const db = require("dataprovider");
...
let result = getUserNames();
async function getUserNames() {
return await db.GetUsernames();
}
詳細は http://javascriptrambling.blogspot.com/2017/04/to-promised-land-with-asyncawait-and.html を参照してください。
また、FYIと同様に、クラスを返す場合を除き、小文字で関数を開始するためのコード規約です。
async-awaitパターンはコードを読みやすくします。しかし、ノードはグローバルな待機を許可しません。非同期フローのみを待つことができます。あなたがしようとしていることは、非同期フローの外で待つことです。これは許可されていません。これは、ノードアプリケーションの一種のアンチパターンです。 promiseを処理するときに実際に行うのは、プログラムで非同期フローを生成することです。私たちのプログラムは約束を待たずに続行します。そのため、関数を非同期としてエクスポートできますが、非同期フロー外でそれらを待つことはできません。例えば。
const db = require('dataprovider');
...
let result = (async () => await db.GetUserNames())();
console.log(result); // outputs: Promise { <pending> }
したがって、非同期フローでは非同期待機パターンが機能します。したがって、それらを非同期関数内で使用して、ノードがそれらを非同期で実行できるようにします。また、プロミスを待つこともできます。例えば。
let fn = async () => await new Promise( (resolve, reject)=>{...} );
fn().then(...);
ここで、非同期関数「fn」を作成しました。この関数はその後使用可能です。また、別の非同期関数内で「fn」を待つこともできます。
let anotherFn = async () => await fn();
anotherFn().then(...);
ここでは、非同期関数内で非同期関数を待機しています。 Async-Awaitパターンは、コードを読みやすく簡潔にします。これは大きなプロジェクトに反映されています。