基本的に、関数内で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);
}
一部の関数がPromiseを返すだけで何も待たない場合、その関数を非同期としてマークする必要がありますか?
私はあなたがすべきではないと言うでしょう。 async
/await
の目的は、約束を作成(および解決)することです。すでに戻る約束がある場合は、async
/await
はその機能に何のメリットもありません。
どちらも待たされますね。
await
は、関数ではなく、promiseで機能します。したがって、await
は、そのプロミスが手動で作成されたか、async
によって舞台裏で作成されたかに関係なく、どのプロミスでも正常に機能します。
なんらかの理由で呼び出した関数がエラーをスローするの場合、async
キーワードは、これが返されることを確認します拒否された約束として関数によって。
async
キーワードは、戻り値から約束を返す(たとえば、APIの一貫性のために)手動で作成する必要なしに)したい関数でも使用できます。 Promiseオブジェクト。
async
キーワードは常にawaitとペアになっているわけではありませんだと思います。
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);
}
関数が「何も待っていない」場合-これは通常の関数であり、return関数内でも非同期である可能性があります(これはカプセル化ではありません)...