模拟实现Promise.all方法

本文详细介绍了如何模拟实现Promise.all和Promise.race方法。Promise.all接收Promise数组,当所有实例变为resolve时返回结果数组;如果有任何一个变为reject,则整体变为reject。而Promise.race则在Promise数组中第一个改变状态的实例决定结果,即一个实例变为resolve或reject,整个Promise就会跟随其状态。文章还总结了Promise.all的特点,包括接收Promise数组、转成Promise、全部成功或一个失败等关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟实现 Promise.all 方法

function myall(proArr) {
  // 返回一个promise实例
  return new Promise((resolve, reject) => {
    // 判断参数是否是数组
    if (!Array.isArray(proArr)) {
      return reject(new TypeError('arguments must be Array'))
    }

    let count = 0
    let newValues = new Array(proArr.length)  // 接收新的结果参数 建立一个伪数组
    for (let i = 0; i < proArr.length; i++) {
      // 运用promise特性 只会有一个状态
      Promise.resolve(proArr[i]).then(res => {
        count++
        newValues[i] = res // 把每次返回成功的数据添加到数组中
        if (count === proArr.length) { // 数据接收完成
          return resolve(newValues)
        }
      }, rej => reject(rej))
    }
  })
}

 

模拟实现 Promise.race 方法

同样接受一个数组作为参数。只要p1p2p3之中有一个实例的状态先发生改变,p的状态就跟着改变。并把第一个改变状态的 Promise 实例的返回值,传递给p的回调函数。

function myrace(proArr) {
  return new Promise((resolve, reject) => {
    for (let i = 0; i < proArr.length; i++) {
      proArr[i].then(resolve, reject);
    }
  })
}

 

Promise.all

Promise.all 接收一个 promise 对象的数组作为参数,当这个数组里的所有 promise 对象全部变为resolve或 有 reject 状态出现的时候,它才会去调用 .then 方法,它们是并发执行的。

var p1 = Promise.resolve(1),
var p2 = Promise.resolve(2),
var p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
    console.log(results);  // [1, 2, 3]
});

在上面的方法中,promise 数组中所有的 promise 实例都变为resolve 的时候,该方法才会返回,并将所有结果传递 results 数组中。

promise 数组中任何一个 promise 为 reject 的话,则整个 Promise.all 调用会立即终止,并返回一个 reject 的新的 promise 对象。reject 使用示例如下:

var p1 = Promise.resolve(1),
var p2 = Promise.reject(2),
var p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
    //then方法不会被执行
    console.log(results);
}).catch(function (e){
    //catch方法将会被执行,输出结果为:2
    console.log(e);
});

总结 promise.all 的特点

1、接收一个 Promise 实例的数组或具有 Iterator 接口的对象,

2、如果元素不是 Promise 对象,则使用 Promise.resolve 转成 Promise 对象

3、如果全部成功,状态变为 resolved,返回值将组成一个数组传给回调

4、只要有一个失败,状态就变为 rejected,返回值将直接传递给回调 all() 的返回值也是新的 Promise 对象

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值