この解答例はChatGPTによって生成されています,正しいかは自己判断で。 皆の投稿からも解答例が見つかるかもしれませんよ。
BFE.devでのAI解答例 - JavaScript コーディング問題
33. `Promise.allSettled()`を実装する
以下は、 Promise.allSettled()
を実装するコード例です。
Promise.allSettled = function(promises) { return new Promise(function(resolve, reject) { if (!Array.isArray(promises)) { return reject(new TypeError('arguments must be an array')); } var resolvedPromises = []; var resolvedCount = 0; var promisesCount = promises.length; var result = []; promises.forEach(function(promise, index) { Promise.resolve(promise).then(function(value) { resolvedCount++; resolvedPromises[index] = { status: 'fulfilled', value: value }; if (resolvedCount === promisesCount) { resolve(resolvedPromises); } }, function(reason) { resolvedCount++; resolvedPromises[index] = { status: 'rejected', reason: reason }; if (resolvedCount === promisesCount) { resolve(resolvedPromises); } }) }); });};
この実装では、 Promise.allSettled()
は次のように動作します。
- 引数に渡された
promises
配列を反復処理して、それぞれのpromiseを解決/拒否する。 - 解決/拒否されたpromiseを
result
配列に格納し、resolvedCount
変数に加算する。 resolvedCount
がpromisesCount
に等しくなったときは(つまり、すべてのpromiseが解決/拒否されたときは)、resolve
関数を呼び出してresolvedPromises
配列を解決する。- 正常に解決/拒否されなかったpromiseの場合は、配列の
status
プロパティが"fulfilled"
または"rejected"
に設定され、結果の値または理由が格納されます。
上記のコードは単一の引数のみを考慮していますが、 Promise.allSettled()
は複数の引数を受け取ることができます。これは arguments
が配列に変換されて使用されるためです。