Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step

Home Page:https://juejin.cn/column/7244788137410560055

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

3. 实现Promise.allSettled

Sunny-117 opened this issue · comments

/**
   * 等待所有的Promise有结果后
   * 该方法返回的Promise完成
   * 并且按照顺序将所有结果汇总
   * @param {Iterable} proms
   */
  Promise.allSettled=function(proms) {
    const ps = [];
    for (const p of proms) {
      ps.push(
        MyPromise.resolve(p).then(
          (value) => ({
            status: FULFILLED,
            value,
          }),
          (reason) => ({
            status: REJECTED,
            reason,
          })
        )
      );
    }
    return MyPromise.all(ps);
  }
Promise.myAllSettled = function (proms) {
  return new Promise((resolve, reject) => {
    let settledCount = 0; //状态已经确定的promise数
    let count = 0; //promise总数
    const result = [];
    for (const prom of proms) {
      let i = count;
      count++;
      Promise.resolve(prom).then(
        (data) => {
          settledCount++;
          result[i] = {
            status: "fullfilled",
            value: data,
          };
        },
        (reason) => {
          settledCount++;
          result[i] = {
            status: "rejected",
            reason,
          };
        }
      ).finally(() => {
        if(settledCount >= count){
          resolve(result)
        }
      });
    }
  });
};

const pro = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(3);
  }, 1000);
});

Promise.allSettled([pro, Promise.resolve(1), Promise.reject(2)]).then(
  (data) => {
    console.log(data);
  }
);

Promise.myAllSettled([pro, Promise.resolve(1), Promise.reject(2)]).then(
  (data) => {
    console.log(data);
  }
);
commented
Promise.prototype.mySettled = function (promises) {
  return new Promise((resolve) => {
    const data = [],
      len = promises.length;
    let cnt = 0;
    for (let i = 0; i < len; i++) {
      const promise = promises[i];
      Promise.resolve(promise)
        .then(
          (res) => {
            data[i] = { status: "fulfilled", value: res };
          },
          (error) => {
            data[i] = { status: "rejected", reason: error };
          }
        )
        .finally(() => {
          if (cnt === len) resolve(data);
        });
    }
  });
};
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =>
  setTimeout(reject, 100, "foo")
);
const promises = [promise2, promise1];
Promise.allSettled(promises).then((results) =>
  results.forEach((result) => console.log(result))
);
function allSettled(promises) {
  return Promise.all(promises.map(p => Promise.resolve(p).then(
    value => ({ status: 'fulfilled', value }),
    reason => ({ status: 'rejected', reason })
  )));
}
commented

Promise.allSettled = function (ites) {
let count = 0;
let result = [];
return new Promise((resolve, reject) => {
for (let i = 0; i < ites.length; i++) {
Promise.resolve(ites[i])
.then((val) => {
count++;
result[i] = val;
if (count === ites.length) {
resolve(result);
}
})
.catch((val) => {
count++;
result[i] = val;
if (count === ites.length) {
resolve(result);
}
});
}
});
};