この解答例は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 変数に加算する。
  • resolvedCountpromisesCount に等しくなったときは(つまり、すべてのpromiseが解決/拒否されたときは)、 resolve 関数を呼び出して resolvedPromises 配列を解決する。
  • 正常に解決/拒否されなかったpromiseの場合は、配列の status プロパティが "fulfilled" または "rejected" に設定され、結果の値または理由が格納されます。

上記のコードは単一の引数のみを考慮していますが、 Promise.allSettled() は複数の引数を受け取ることができます。これは arguments が配列に変換されて使用されるためです。