この解答例は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
が配列に変換されて使用されるためです。