手写 Promise.all

语法

Promise.all(iterable);

参数

iterable

一个可迭代对象,如 Array 或 String

返回值

  • 如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的 Promise
  • 如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved) Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的 Promise
  • 其它情况下返回一个处理中(pending)Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。 见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。

1) 核心思路

  1. 接收一个 Promise 实例的数组或具有 Iterator 接口的对象作为参数
  2. 这个方法返回一个新的 promise 对象,
  3. 遍历传入的参数,用Promise.resolve()将参数"包一层",使其变成一个promise对象
  4. 参数所有回调成功才是成功,返回值数组与参数顺序一致
    let all1=function(arr){
        let index=0,result=[]
        return new Promise((resolve,reject)=>{
            arr.forEach((p,i)=>{
                //普通值返回成功状态,promise直接返回(不改变成功或者失败状态)
                Promise.resolve(p).then(
                    //成功
                    val=>{
                    index++
                    result[i]=val
                    if(index===arr.length){
                        //返回全部成功的数组
                        resolve(result)
                    }
                },err=>{
                    //失败
                    reject(err)
                })
            })
        })
    }
    let p1 = new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve(1)
        }, 1000)
    })
    let p2 = new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve(2)
        }, 2000)
    })
    let p3 = new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve(3)
        }, 3000)
    })
    all1([p3, p1, p2]).then(res => {
        console.log(res) // [3, 1, 2]
    })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值