今天又有用到了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 这个是看时间输出的谁执行的快就输出谁