503 字
3 分钟
手撕Promise.API
2024-08-25

手撕Promise.all#

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(88);
  }, 100);
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(99);
  }, 100);
});

const myPromiseAll = (array) => {
  let results = [];
  let count = 0;
  return new Promise((resolve, reject) => {
    for (let index in array) {
      if (array[index] instanceof Promise) {
        array[index].then(
          (res) => {
            results[index] = res;
            count++;
            if (count === array.length) {
              resolve(results);
            }
          },
          (err) => {
            reject(err);
          }
        );
      } else {
        results[index] = array[index];
        count++;
        if (count === array.length) {
          resolve(results);
        }
      }
    }
  });
};

let arr = [promise1, promise2, 3, 4];

myPromiseAll(arr)
  .then((res) => {
    console.log(res, "res");
  })
  .catch((err) => {
    console.log(err, "err");
  });

手撕Promise.race#


const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(88);
  }, 1000);
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("error");
  }, 500);
});

const myPromiseRace = (array) => {
  let results = "";
  return new Promise((resolve, reject) => {
    for (let index in array) {
      if (array[index] instanceof Promise) {
        array[index].then(
          array[index].then(
            (res) => {
              results = res;
              resolve(results);
            },
            (err) => {
              reject(err);
            }
          )
        );
      } else {
        results = array[index];
        resolve(results);
      }
    }
  });
};

let arr = [promise1, promise2];

myPromiseRace(arr)
  .then((res) => {
    console.log(res, "res");
  })
  .catch((err) => {
    console.log(err, "err");
  });


let arr1 = [promise1, promise2, 3, 4];

myPromiseRace(arr1)
  .then((res) => {
    console.log(res, "res");
  })
  .catch((err) => {
    console.log(err, "err");
  });


手撕Promise.race#

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

const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(88);
  }, 1000);
});

const myPromiseAny = (array) => {
  let results = "";
  return new Promise((resolve, reject) => {
    for (let index in array) {
      if (array[index] instanceof Promise) {
        array[index].then(
          array[index].then(
            (res) => {
              results = res;
              resolve(results);
            },
            (err) => {
              console.log("跳过错误");
            }
          )
        );
      } else {
        results = array[index];
        resolve(results);
      }
    }
  });
};

let arr = [promise1, promise2];

myPromiseAny(arr)
  .then((res) => {
    console.log(res, "res");
  })
  .catch((err) => {
    console.log(err, "err");
  });

手撕Promise.allSettled#

const promise1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(88);
  }, 100);
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject("error 99");
  }, 100);
});

const myPromiseAllSettled = (array) => {
  let results = [];
  let count = 0;
  return new Promise((resolve, reject) => {
    for (let index in array) {
      if (array[index] instanceof Promise) {
        array[index].then(
          (res) => {
            results[index] = { result: res, status: "fulfilled" };
            count++;
            if (count === array.length) {
              resolve(results);
            }
          },
          (err) => {
            results[index] = { error: err, status: "rejected" };
            count++;
            if (count === array.length) {
              resolve(results);
            }
          }
        );
      } else {
        results[index] = { result: array[index], status: "fulfilled" };
        count++;
        if (count === array.length) {
          resolve(results);
        }
      }
    }
  });
};

let arr = [promise1, promise2, 3, 4];

myPromiseAllSettled(arr)
  .then((res) => {
    console.log(res, "res");
  })
  .catch((err) => {
    console.log(err, "err");
  });



手撕Promise.API
https://www.irisation.tech/posts/前端/js系列/手撕promiseapi/
作者
Dawson
发布于
2024-08-25
许可协议
CC BY-NC-SA 4.0