promiseコンストラクターエグゼキューター関数内でpromiseを効果的に使用しているので、これはPromiseコンストラクターのアンチパターンです。
あなたのコードは主なリスクの良い例です:すべてのエラーを安全に伝播しないこと。なぜそこにあるのかを読んでください。
さらに、async
/await
を使用すると、同じトラップがさらに驚くべきものになる可能性があります。比較:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
ナイーブな(間違った)async
同等のもの:
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
最後のものについては、ブラウザのWebコンソールを調べてください。
最初のものは、Promiseコンストラクターエグゼキューター関数の即時例外が新しく構築されたpromiseを都合よく拒否するために機能.then
します(ただし、自分自身の内部では)。
async
関数内の即時例外は、async
関数自体によって返される暗黙のpromiseを拒否するため、2番目のものは機能しません。
promiseコンストラクターエグゼキューター関数の戻り値は使用されていないので、それは悪いニュースです!
あなたのコード
あなたが定義することができない理由はありませんmyFunction
ようにasync
。
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
持っているのになぜ古い同時実行制御ライブラリを使用するのawait
ですか?