Promise
Promise是ES6新增的一个类,可以翻译为承诺、期约
当通过new创建Promise实例时,需要传入一个回调函数,我们称之为executor(执行人)
- 这个回调函数会被立刻执行,并传入两个回调参数
resolve(解决)、reject(拒绝) - 当调用
resolve回调函数时,会执行 Promise 对象的then方法传入的回调 - 当调用
reject回调函数时,会执行 Promise 对象的catch方法传入的回调
Promise是一个状态机,分为 3 种状态:
-
pending:待定状态,执行了 executor 后,处于该状态 -
fulfilled:兑现状态,调用resolve()后,Promise 的状态更改为 fullfilled,且无法再次更改 -
rejected:拒绝状态,调用reject()后,Promise 的状态更改为 rejected,且无法再次更改
function request() {
const flag = Math.random() <= 0.5 ? true : false
return new Promise((resolve, reject) => {
setTimeout(() => {
if (flag) {
resolve('成功的消息')
return
}
reject('失败的消息')
}, 2000)
})
}
console.log('请求开始')
request()
.then(msg => console.log(msg), err => console.log(err))
通过then方法可以对 Promise 中的resolve进行处理。then方法的返回值是一个 Promise 实例
除了then方法的第二个参数来捕获reject错误之外,还可以通过catch方法,catch 返回一个 Promise
finally 是 ES9(ES2018) 新增的一个特性,无论一个Promise实例是fulfilled或rejected,finally都会执行。
all 方法
Promise.all()接收一个Promise[],返回一个Promise实例,当所有的 Promise 执行完毕并且都是fulfilled时,该实例的状态才会变为fulfilled,只要队列中有一个实例的状态是rejected,那么该实例的状态也会变为rejected
如果 Promise 队列中所有的实例状态都是fulfilled,那么Promise.all()返回的实例的状态就会变为fulfilled,并且resolve()的参数(应该是then?)是一个数组,按照顺序放置队列中每个 Promise 成功后的结果
本文为学习笔记,内容来自JavaScript高级深入浅出:Promise 详解 - 掘金 (juejin.cn)