1. ホーム
  2. typescript

[解決済み] async/await構文で拒否する方法は?

2022-03-23 02:19:24

質問

が返すプロミスを拒否するにはどうすればよいですか? async await 機能ですか?

例)元々。

foo(id: string): Promise<A> {
  return new Promise((resolve, reject) => {
    someAsyncPromise().then((value)=>resolve(200)).catch((err)=>reject(400))
  });
}

に翻訳します。 async / await :

async foo(id: string): Promise<A> {
  try{
    await someAsyncPromise();
    return 200;
  } catch(error) {//here goes if someAsyncPromise() rejected}
    return 400; //this will result in a resolved promise.
  });
}

では、この場合、どうすればこの約束をきちんと拒否できるのでしょうか?

解決方法は?

最良の方法は throw アン Error が値をラップしているため、プロミスが拒否され、その結果 Error を包む。

} catch (error) {
    throw new Error(400);
}

また、単に throw を指定した場合、スタックトレース情報はありません。

} catch (error) {
    throw 400;
}

あるいは、拒否されたプロミスを Error は値をラップしますが、イディオム的ではありません。

} catch (error) {
    return Promise.reject(new Error(400));
}

(または単に return Promise.reject(400); しかし、この場合、コンテキスト情報がありません)。

あなたの場合 TypeScriptfoo の戻り値は Promise<A> ということであれば、これを使うことになります。

return Promise.reject<A>(400 /*or Error*/ );

の中に async / await のような状況で、最後はちょっと意味不明なマッチングかもしれませんが、うまくいきます。

を投げると Error を消費するものとうまく連携することができます。 foo の結果を await の構文があります。

try {
    await foo();
} catch (error) {
    // Here, `error` would be an `Error` (with stack trace, etc.).
    // Whereas if you used `throw 400`, it would just be `400`.
}