ホームページ > ウェブフロントエンド > jsチュートリアル > Promise コンストラクター内で Async/Await を使用することがアンチパターンなのはなぜですか?

Promise コンストラクター内で Async/Await を使用することがアンチパターンなのはなぜですか?

Susan Sarandon
リリース: 2025-01-05 11:23:41
オリジナル
753 人が閲覧しました

Why is Using Async/Await Inside a Promise Constructor an Anti-Pattern?

Promise コンストラクターのアンチパターン: Promise() 内での Async/Await の使用

非同期プログラミングで、executor 関数内で async/await を使用するPromise() コンストラクターの使用はアンチパターンとみなされます。この実践には、Promise 内に Promise を埋め込むことが含まれており、正しく伝播されない可能性のある潜在的なエラーが発生します。

以下のコード スニペットを考えてみましょう。

const { eachLimit } = require("async");

function myFunction() {
 return new Promise(async (resolve, reject) => {
   eachLimit((await getAsyncArray), 500, (item, callback) => {
     // do other things that use native promises.
   }, (error) => {
     if (error) return reject(error);
     // resolve here passing the next value.
   });
 });
}
ログイン後にコピー

この例では、myFunction が呼び出され、 Promise コンストラクターは、実行者として async 関数を使用して呼び出されます。このパターンは、エラーが適切に伝播されない可能性があるため、問題があります。 eachLimit コールバック内でエラーが発生した場合、それらは Promise によって捕捉されず、黙って失敗します。

さらに、Promise コンストラクター内で async/await を使用すると、これらのトラップがさらに驚くべきものになる可能性があります。たとえば、以下を比較してください:

let p = new Promise(resolve => {
  ""(); // TypeError
  resolve();
});

(async () => {
  await p;
})().catch(e => console.log("Caught: " + e)); // Catches it.
ログイン後にコピー

この例では、TypeError が executor 関数内で同期的にスローされます。ただし、async/await を使用して Promise が待機されている場合、Promise が解決される前にエラーが発生したとしても、エラーは catch ブロックによってキャッチされます。この動作は混乱や予期せぬ結果を引き起こす可能性があります。

このアンチパターンを回避するには、Promise() コンストラクターの executor 関数内で async/await を使用しないことをお勧めします。代わりに、 then または catch メソッドを使用して、追加の Promise を連鎖させ、エラーを処理します。

以上がPromise コンストラクター内で Async/Await を使用することがアンチパターンなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート