今天又有用到了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的状态由p1、p2、p3决定,分成两种情况。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成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 这个是看时间输出的谁执行的快就输出谁