web-dev-qa-db-ja.com

ノードモジュールから非同期関数をエクスポートする方法

さまざまな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関数を使用するだけで問題なく動作します。)

たぶん私のグーグルスキルはひどいかもしれませんが、私はこの問題について、私が使用できるものをグーグルで管理することができませんでした。

私のモジュールで、他の場所で待機できる非同期関数をどのように作成しますか?

4
Nicolai

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と同様に、クラスを返す場合を除き、小文字で関数を開始するためのコード規約です。

7
Kevin Williams

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パターンは、コードを読みやすく簡潔にします。これは大きなプロジェクトに反映されています。

1
Market Queue