ES6的Promise

现如今,如果作为一个开始工作的前端,Promise在工作中是必须要用的一种东西,除非还在使用之前的ajax那种疯狂回调的请求的老项目。

Promise的出现也为我们解决回调地狱带来了一种解决方法。

当然随之ES6推出的async/await也成为如今调用方法的一种方式(之后再说)

Promise三种状态

1. pending, 等待

2. fulfilled, 完成

3. rejected 也可以说是完成,但是不是我们想要的,进入错误回调

这三种状态的关系是

pending执行之后才是剩下两个,两个不同的方向,调用之后fulfilled走then, 而rejected走错误

function func(a) {
    return new Promise((resolve, reject) => {
        if (a === 1) {
            resolve()
        } else { 
            reject()
        }
    })
}

// 
// 当func传1的时候走的then, 当func传的是其他的时候走的catch, finally不管resolve还是reject都会进入

func(1).then(() => {
    console.log('判断正确')
}).catch(() => {
    console.log('错误')
}).finally(() => {
    console.log('执行完毕')
})

了解下Promise的几个比较重要且能用到的方法

1. promise.then, promise.catch, promise.finally(上文有说,不做太多阐述)

promise.then返回的也是一个Promise对象,可以继续链式调用

2. Promise.all

这个方法在我们的日常开发中也有场景可以用到

之前参加某公司面试的时候,也被问相关的问题,由于当时公司的原因,接触不多,了解不多,导致gg

Promise.all([])接一个数组,当这个数组所有的Promise对象状态都变成fulfilled或者rejected的时候,它才会去调用then方法或者catch方法。

一旦有一个Promise状态变成rejected,会走进catch方法

如果数组中的Promise状态都变成fulfilled的话,then里面的返回顺序跟数组的顺序一致

function func(a) {
    return new Promise((resolve, reject) => {
        if (a === 1) {
            resolve('1')
        } else { 
            reject('2')
        }
    })
}

function fun2(b) {
    return new Promise((resolve, reject) => {
        if (b === 1) {
            resolve('11')
        } else { 
            reject('22')
        }
    })
}

Promise.all([func(1), fun2(1)]).then(res => {
    console.log('then', res) // then [ '1', '11' ]
}).catch(res => {
    console.log('catch', res)
}).finally(res=> {
    console.log('finally', res)
})

3. Promise.allSettled

这个的出现主要是上面的Promise.all在数组中只要有一个Promise rejected之后就会进入reject,并且返回的是数组中第一个rejected的返回信息,导致fulfilled的Promise无法进入Promise.all的then

同样的上文的代码,配置一个进入rejected的Promise对象,返回值如下

function func(a) {
    return new Promise((resolve, reject) => {
        if (a === 1) {
            resolve('1')
        } else { 
            reject('2')
        }
    })
}

function fun2(b) {
    return new Promise((resolve, reject) => {
        if (b === 1) {
            resolve('11')
        } else { 
            reject('22')
        }
    })
}

Promise.allSettled([func(1), fun2(12)]).then(res => {
    console.log('then', res) //then [{ status: 'fulfilled', value: '1' },{ status: 'rejected', reason: '22' }]
}).catch(res => {
    console.log('catch', res)
}).finally(res=> {
    console.log('finally', res)
})

这个方法,可以返回当前数组里Promise的每个的状态,我们可以根据这个来做下一步操作

Promise的方法和基本用法就是这些了

但是有个问题出现了,如果一直then里面执行Promise,那也会出现回调地狱的情况

function func(a) {
    return new Promise((resolve, reject) => {
        if (a === 1) {
            resolve('1')
        } else { 
            reject('2')
        }
    })
}

function fun2(b) {
    return new Promise((resolve, reject) => {
        if (b === 1) {
            resolve('11')
        } else { 
            reject('22')
        }
    })
}


function fun3(b) {
    return new Promise((resolve, reject) => {
        if (b === 1) {
            resolve('11')
        } else { 
            reject('22')
        }
    })
}

func(1).then(() => {
    fun2(1).then((res) => {
        fun3(1).then((res) => {
            ... //依次递增
        })
    })
})

为了解决这种情况,async/await是一种不错的解决方法

看下篇

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值