Promise中的finally、all、race方法

Promise.prototype.finally

该方法接收一个onFinally处理程序作为参数,不同于then和catch方法,该方法不关心最后落定成什么状态,只要状态由默认状态落定成功状态或失败状态,该处理程序都会执行。该方法不关心最后的结果,所以onFinally处理程序不接受参数,

let promise = new Promise((res, rej) => {
    setTimeout(() => {
        res('success')
    }, 3000)
})
promise.finally(() => {
    console.log('我执行啦')
})

//控制台打印
//我执行啦(3秒后)
let promise = new Promise((res, rej) => {
    setTimeout(() => {
        rej()
    }, 3000)
})
promise.finally(() => {
    console.log('我执行啦')
})

//控制台打印
//我执行啦(3秒后)

返回值:大多数情况该方法回原样返回父Promsie实例,但是如果处理程序返回一个pedding状态的实例或处理程序内部抛出错误(显示抛出或返回一个拒绝promsie)则会返回相应的promsie实例(待定或拒绝)


Promise.all

该方法的参数是一个可迭代对象,内部的全部的promsie解决后才会返回解决的promise实例。解决的结果就是每一个promise解决结果构成的数组

//创建几个解决的promsie实例
let promise1 = Promise.resolve(1)
let promise2 = Promise.resolve(2)
let promise3 = Promise.resolve(3)

//除了这几个解决的promise可迭代对象中还添加了数字2
let promise = Promise.all([promise1, promise2, promise3,2])
console.log(promise)

请添加图片描述

这里要注意的是,就算可迭代对象中添加的不是promise实例也会由Promsie.resolve方法包装成解决的promise实例

当然也有可迭代对象中不全是解决的promise实例的情况,继续看例子:

  • 有拒绝promsie的情况,就返回这个拒绝的promsie的镜像(如果有多个拒绝,则返回第一个)

    //成功的promsie实例
    let promise1 = Promise.resolve(1)
    let promise2 = Promise.resolve(2)
    //失败的promsie实例
    let promise3 = Promise.reject('失败啦')
    let promise4 = Promise.reject('又又又失败啦')
    
    let promise = Promise.all([promise1, promise2, promise3, promise4, 2])
    console.log(promise)
    

    请添加图片描述

  • 有处于pending的promsie,就返回的promsie实例也处于pending状态

    let promise1 = Promise.resolve(1)
    let promise2 = Promise.resolve(2)
    let promise5 = new Promise(() => {})
        // let promise3 = Promise.reject('失败啦')
        // let promise4 = Promise.reject('又又又失败啦')
    let promise = Promise.all([promise1, promise2, promise5])
    console.log(promise)
    

请添加图片描述

  • 可迭代对象的元素既有拒绝的promsie实例也有处于pending状态的实例,还是返回拒绝的promsie的镜像

    let promise1 = Promise.resolve(1)
    let promise2 = Promise.resolve(2)
    let promise5 = new Promise(() => {})
    let promise3 = Promise.reject('失败啦')
    let promise4 = Promise.reject('又又又失败啦')
    let promise = Promise.all([promise1, promise2, promise3, promise4, promise5])
    

请添加图片描述


Promsie.race

这个方法正好和all方法相反,返回的新promise是这组可迭代对象中最先解决或拒绝的promise的镜像。普通的值同样会用Promise.resolve()包装

let promise1 = new Promise((res, rej) => {
    setTimeout(() => {
        res('YES')
    }, 3000)
})

let promise2 = Promise.reject('NO')

let promise = Promise.race([promise1, promise2])

请添加图片描述

let promise1 = new Promise((res, rej) => {
    setTimeout(() => {
        res('YES')
    }, 3000)
})

let promise2 = Promise.reject('NO')

let promise = Promise.race([promise1, promise2])

请添加图片描述

let promise1 = new Promise((res, rej) => {
    setTimeout(() => {
        rej('NO')
    }, 3000)
})
let promise2 = new Promise((res, rej) => {
    setTimeout(() => {
        rej('~~~~~~~NO')
    }, 2000)
})


let promise = Promise.race([promise1, promise2])

//此时打印的promsie是处于pedding状态的
console.log(promise)

//四秒后打印promise
setTimeout(() => {
    console.log(promise)
}, 4000)

请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值