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 サイトの他の関連記事を参照してください。