自己实现一个PromiseAll和PromiseAllseted

1、自己实现一个promiseAll

    Promise.all() 方法接收一个由 Promise 对象组成的数组作为参数,当所有 Promise 都成功完成时,返回的 Promise 对象就会成功完成,然后将结果以数组形式返回;而只要有一个 Promise 失败了,Promise.all() 返回的 Promise 对象就会失败,这时第一个被拒绝的 Promise 的结果会被传递给该 Promise.all() 返回的 Promise 对象。

自己实现一个类似的函数,可以按照以下步骤:

1、创建一个新 Promise 对象并返回。
2、在该函数中创建一个空的数组,用于存放每个 Promise 对象的结果。
3、使用 forEach(或 for 循环)遍历传入的 Promise 数组,并对每个 Promise 对象调用 .then() 方法。
4、在 .then() 方法中,将该 Promise 的结果添加到结果数组中。
5、如果其中有某个 Promise 被拒绝,将其拒因传递给新 Promise 对象的 .reject() 方法。
6、当所有 Promise 都处理完毕后,将结果数组传递给新 Promise 对象的 .resolve() 方法。

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let count = promises.length;
    promises.forEach((promise, index) => {
      promise.then(result => {
        results[index] = result;
        count--;
        if (count === 0) { // 所有 Promise 都已完成
          resolve(results);
        }
      }).catch(error => {
        reject(error); // 任一 Promise 被拒绝,整个 Promise.all() 失败
      });
    });
  });
}

注意事项:

  • 传入的参数必须是一个数组,并且每个元素都是 Promise 对象。

  • 返回的 Promise 对象在所有输入的 Promise 都成功完成时才会成功,如果其中有任何一个被拒绝,将返回第一个被拒绝的 Promise 的结果。

2、自己实现一个promiseAllSetted方法

假设你要实现一个名为 promiseAllSettled 的函数,它与原生 Promise.allSettled() 方法类似,接收一组 Promise 对象数组,并在它们全部被解析或拒绝后返回一个对象数组。返回的对象数组应该每个元素都包含一个表示 Promise 状态的字符串属性(“fulfilled” 或 “rejected”)和一个具体值属性,如果状态是 “fulfilled”,则此值属性应为该 Promise 的解析值;如果状态是 “rejected”,则此值属性应为该 Promise 的拒因。

以下是实现 promiseAllSettled函数的步骤:

  1. 创建一个新 Promise 对象并返回。
  2. 在该函数中创建一个空数组,用于存储每个 Promise 对象的状态和结果。
  3. 使用 forEach(或 for 循环)遍历传入的 Promise 数组,并对每个 Promise 对象调用 .then() 和 .catch() 方法。
  4. 在 .then() 方法中将一个包含 “fulfilled” 状态和解析值的对象添加到结果数组中。
  5. 在 .catch() 方法中将一个包含 “rejected” 状态和拒因的对象添加到结果数组中。
  6. 当所有 Promise 都处理完毕后,将结果数组传递给新 Promise 对象的 .resolve() 方法。
function promiseAllSettled(promises) {
  return new Promise((resolve) => {
    const results = [];
    let count = promises.length;
    
    promises.forEach((promise, index) => {
      promise
        .then(result => {
          results[index] = { status: "fulfilled", value: result };
        })
        .catch(error => {
          results[index] = { status: "rejected", reason: error };
        })
        .finally(() => {
          count--;
          if (count === 0) {
            resolve(results);
          }
        });
    });
  });
}

注意事项:

  • 返回的结果数组中每个元素都应该包含一个 “status” 和一个值属性,如果状态是 “fulfilled”,则该值属性应为 Promise 的解析值;如果状态是 “rejected”,则该值属性应为 Promise 的拒因。
  • 返回的 Promise 对象将在所有输入的 Promise 都已被解析或拒绝后完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值