Promise复习

今天又有用到了promise处理逻辑的时候,一个简单的注册接口:

router.post('/reg', (req, res) => {
    //获取数据
    let {
        us,
        ps
    } = req.body
    if (us && ps) {
        User.find({
                us
            })
            .then((data) => {
                console.log(data)
                if (data.length > 0) {
                    res.send({
                        err: 0,
                        msg: '用户已存在'
                    })
                } else {
                    //用户名不存在 可注册 把promise对象抛出去
                    return User.insertMany({
                        us,
                        ps
                    })
                }
            })
            .then(() => {
                res.send('注册成功')

            })
            .catch((err) => {
                return res.send({
                    err: "内部错误"
                })
            })

    } else {
        res.send({
            err: '用户名或密码为空'
        })
    }
})

需要注意:

1.成功回调运行.then 不成功运行.catch 

2. .then可以有多个 ,.catch只有一个,谁不成功就往里面走

3.每次.then都要返回一个promise对象才能连成链式

如何终止链式调用?

手动终止:return new Error 通过抛出一个错误

p1.then(function(data){
    console.log('p1 then resolve',data)
    return new Error('手动终止')
})
.then(function(data){
    console.log('p2 then resolve',data)
    return p3
})
.then(function(data){
    console.log('p3 then resolve',data)
})

  

Promise API

.then(,)//不推荐用第二个,而应使用catch,可捕获其他错误 

.catch()//捕获在此之前的错误

.finally()//不管最后状态如何,都会执行 ,不接受任何参数,与promise状态无关

.all() //  Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

p的状态由p1p2p3决定,分成两种情况。

(1)只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

.race  / /Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

.allSettled  //Promise.allSettled()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例

.any() //Promise.any()方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。

.resolve() //有时需要将现有对象转为 Promise 对象,Promise.resolve()方法就起到这个作用。

.rejected //Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected

 

.all和.race区别: 

Promise.all 不管你的时间只是按照你写的先后顺序来输出的
Promise.race 这个是看时间输出的谁执行的快就输出谁

posted @ 2020-05-30 22:12  戴三山  阅读(213)  评论(0编辑  收藏  举报