web-dev-qa-db-ja.com

関数を非同期としてマークするタイミング

基本的に、関数内でasyncを使用する場合は、関数の前にawaitキーワードを付ける必要があります。しかし、ある関数がPromiseを返すだけで何も待たない場合は、その関数をasyncとしてマークする必要がありますか?

どちらも正しいかどうかのようですか?

// with async (returns Promise)
async getActiveQueue() {
   return redisClient.zrangeAsync(activeQueue, 0, -1);
}

// difference? Both could be awaited isn't it?
getActiveQueue() {
   return redisClient.zrangeAsync(activeQueue, 0, -1);
}
20
Alendorff

一部の関数がPromiseを返すだけで何も待たない場合、その関数を非同期としてマークする必要がありますか?

私はあなたがすべきではないと言うでしょう。 async/awaitの目的は、約束を作成(および解決)することです。すでに戻る約束がある場合は、async/awaitはその機能に何のメリットもありません。

どちらも待たされますね。

awaitは、関数ではなく、promiseで機能します。したがって、awaitは、そのプロミスが手動で作成されたか、asyncによって舞台裏で作成されたかに関係なく、どのプロミスでも正常に機能します。

12
Stephen Cleary

なんらかの理由で呼び出した関数がエラーをスローするの場合、asyncキーワードは、これが返されることを確認します拒否された約束として関数によって。

asyncキーワードは、戻り値から約束を返す(たとえば、APIの一貫性のために)手動で作成する必要なしに)したい関数でも使用できます。 Promiseオブジェクト

asyncキーワードは常にawaitとペアになっているわけではありませんだと思います。

7
Marinos An

asyncキーワードは、awaitキーワードを関数に許可することだけではありません。

これにより、例外が発生した場合でも、関数は常にPromiseを返すようになります。

違いを示すコードスニペットは次のとおりです。

async function f(x) {
    if (!x)
        throw new Error('failed')

    return new Promise((resolve, reject) => {
        resolve(x + 1);
    });
}

f(false).then(
    result => console.log('f result', result),
    error => console.log('f async error', error)
);

Asyncキーワードをスキップし、関数で例外が発生した場合、それはpromiseに変換されないため、同期的にキャッチする必要があります。

function g(x) {
    if (!x)
        throw new Error('failed');

    return new Promise((resolve, reject) => {
        resolve(x + 1);
    });
}

try {
    g(false).then(
        result => console.log('g result', result),
    )
}
catch (error) {
    console.log('g sync error', error);
}
5
Eloims

関数が「何も待っていない」場合-これは通常の関数であり、return関数内でも非同期である可能性があります(これはカプセル化ではありません)...

0
Alexander