wangjs-jacky / js-challenges

0 stars 0 forks source link

Promise 方法 Promise.race 和 Promise.allSettled 和 Promise.race #17

Open wangjs-jacky opened 10 months ago

wangjs-jacky commented 10 months ago

只需要掌握 Promise.all 的写法,其余函数,这几个函数仅做练习

测试案例如下: Promise.race

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});

Promise.myRace([promise1, promise2]).then((value) => {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// Expected output: "two"

Promise.allSettled

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promises = [promise1, promise2];

Promise.allSettled(promises).then((results) => results.forEach((result) => console.log(result.status)));

// Expected output:
// "fulfilled"
// "rejected"
wangjs-jacky commented 10 months ago

Promise.race 实践

可能经过 Promise.all 的练习后,该函数的实现就非常简单了。 这里说个小技巧,该函数常可用于超时异步响应的拦截处理。

Promise.myRace = function (_promiseList) {
  return new Promise((resolve, reject) => {
    /* promiseList 是一个可迭代对象 */
    const promiseList = Array.from(_promiseList);
    promiseList.forEach((p) => {
      Promise.resolve(p).then((res) => {
        resolve(res);
      }, (err) => {
        reject(err);
      })
    })
  })
}
wangjs-jacky commented 10 months ago

Promise.allSettled 实践

Promise.myAllSettled = function (_promiseList) {
  return new Promise((resolve, reject) => {
    /* promiseList 是一个可迭代对象 */
    const promiseList = Array.from(_promiseList);
    const result = [];
    let resolveCount = 0;
    promiseList.forEach((p, index) => {
      Promise.resolve(p).then((res) => {
        resolveCount++;
        result[index] = {
          status: "fulfilled",
          data: res
        }
        if (resolveCount === promiseList.length) {
          resolve(result)
        }
      }, (err) => {
        resolveCount++;
        result[index] = {
          status: "rejected",
          reason: err
        }
        if (resolveCount === promiseList.length) {
          resolve(result)
        }
      })
    })
  })
}