この解答例はChatGPTによって生成されています,正しいかは自己判断で。
BFE.devでのAI解答例 - JavaScript コーディング問題
30. async helper - `parallel()`を実装する
解法例:
/**
* @param {AsyncFunc[]} funcs
* @returns {(callback: Callback, data: any) => void}
*/
function parallel(funcs) {
return (callback, data) => {
let funcCount = funcs.length;
const results = new Array(funcCount);
let hasError = false;
for (let i = 0; i < funcCount; i++) {
funcs[i]((err, res) => {
if (hasError) {
return;
}
if (err) {
hasError = true;
callback(err);
return;
}
funcCount--;
results[i] = res;
if (funcCount === 0) {
callback(undefined, results);
}
}, data);
}
};
}
考え方:
parallel()
は、配列内に入れられた全ての関数を一度に呼び出し、その結果をまとめ、最後に渡されるコールバックに渡す新しい関数を返します。- インデックスで配列内の関数を識別する必要があるため、
results
配列を使用することになります。配列内に入れられた関数の個数を追跡する必要があります。(個数はfuncCount
で追跡されています。) - 関数が実行されると、呼び出し側関数の最初の引数である
callback
の最初のパラメータでエラーオブジェクトを返すかどうかを検証します。 - スローされたエラーの場合、関数の数を減らし、
hasError
がtrue
に設定され、他の関数がそれ以上呼び出されないようにします。また、そのエラーを最後に渡されるコールバックに返します。 - 検証で問題がない場合は、
funcCount
を減らし、results
配列に格納されます。 - 最後の関数の場合、
funcCount === 0
であるはずで、callback(undefined, results)
を呼び出すことにより単一の配列内の完了した関数から結果が返されます。