この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。
BFE.devでのAI解答例 - JavaScript コーディング問題
92. Promiseをthrottleする
function throttlePromises(promisesArr, maxConcurrency) { return new Promise((resolve, reject) => { const results = []; let currentIndex = 0; let processData = () => { while (maxConcurrency > 0 && currentIndex < promisesArr.length) { maxConcurrency--; const promise = promisesArr[currentIndex]; promise().then((result) => { results[currentIndex] = result; maxConcurrency++; currentIndex++; processData(); }).catch((err) => { reject(err); }) currentIndex++; } if (currentIndex >= promisesArr.length) { resolve(results); } } processData(); });}
解説:
- throttlePromises() 関数を定義してください。 この関数は、promiseを返す一連の関数を含む配列と、同時進行できるAPIの最大数を受け取ります。
- maxConcurrency と promisesArr 配列内の各関数は、この関数が実行されたスコープ内で使用されるインデックスを追跡するために使用されます。 currentIndex は、現在の実行済み関数を示します。
- 関数の内部で、 promisesArr 内の関数を順番に実行する必要があります。
- そのために、関数の最初の
processData()
関数呼び出しを用意します。この関数は、同時に実行できる関数の最大数(maxConcurrency)がある場合、次の関数を直ちに実行することで、非同期プロセスを制御します。 1つの関数が完了すると、同時実行数が1増加し、次の関数がすぐに実行され、以前に完了したのでなければ、別の関数が実行されます。 - 処理が進むにつれて、currentIndex のインクリメントが進むことになるため、promise.catchで例外を捕捉して reject 呼び出しをする必要があります。そのために resolve と reject メソッドを使用してそれぞれ正常処理と異常処理を処理します。
- 最後に、processData () 関数が再帰的に呼ばれ、空きスロットを利用して新しいプロミスが起動可能か調べます。プロミスがすべて処理されるまで、プロミスの中にあるthen()コールバックが resolve になるまで待機します。 つまり、同時に maxConcurrency 数量分までリクエストを送信し続け、すべてのリクエストが完了すると、Promise.all と同様に配列に1つずつ受け取った結果を順に保持し、結果を解決するようにしています。