Promise
- 定义:包含异步操作结果的对象
- 状态
- 进行中:pending
- 已成功:resolved
- 已失败:rejected
- 特点
- 对象的状态不受外界影响
- 一旦状态改变就不会再变,任何时候都可得到这个结果
- 声明:new Promise((resolve, reject) => {})
- 出参
- resolve:将状态从未完成变为成功,在异步操作成功时调用,并将异步操作的结果作为参数传递出去
- reject:将状态从未完成变为失败,在异步操作失败时调用,并将异步操作的错误作为参数传递出去
- 方法
then():分别指定resolved状态和rejected状态的回调函数
- 第一参数:状态变为resolved时调用
- 第二参数:状态变为rejected时调用(可选)
catch():指定发生错误时的回调函数
Promise.all():将多个实例包装成一个新实例,返回全部实例状态变更后的结果数组(齐变更再返回)
- 入参:具有Iterator接口的数据结构
- 成功:只有全部实例状态变成resolved,最终状态才会变成resolved
- 失败:其中一个实例状态变成rejected,最终状态就会变成rejected
- Promise.race():将多个实例包装成一个新实例,返回全部实例状态优先变更后的结果(先变更先返回)
- Promise.resolve():将对象转为Promise对象(等价于new Promise(resolve => resolve()))
- Promise实例:原封不动地返回入参
- Thenable对象:将此对象转为Promise对象并返回(Thenable为包含then()的对象,执行then()相当于执行此对象的then())
- 不具有then()的对象:将此对象转为Promise对象并返回,状态为resolved
- 不带参数:返回Promise对象,状态为resolved
- Promise.reject():将对象转为状态为rejected的Promise对象(等价于new Promise((resolve, reject) => reject()))
应用场景
- 加载图片
- AJAX转Promise对象
重点难点
- 只有异步操作的结果可决定当前状态是哪一种,其他操作都无法改变这个状态
- 状态改变只有两种可能:从pending变为resolved、从pending变为rejected
- 一旦新建Promise对象就会立即执行,无法中途取消
- 不设置回调函数,内部抛错不会反应到外部
- 当处于pending时,无法得知目前进展到哪一个阶段
- 实例状态变为resolved或rejected时,会触发then()绑定的回调函数
- resolve()和reject()的执行总是晚于本轮循环的同步任务
- then()返回新实例,其后可再调用另一个then()
- then()运行中抛出错误会被catch()捕获
- reject()的作用等同于抛出错误
- 实例状态已变成resolved时,再抛出错误是无效的,不会被捕获,等于没有抛出
- 实例状态的错误具有冒泡性质,会一直向后传递直到被捕获为止,错误总是会被下一个catch()捕获
- 不要在then()里定义rejected状态的回调函数(不使用其第二参数)
- 建议使用catch()捕获错误,不要使用then()第二个参数捕获
- 没有使用catch()捕获错误,实例抛错不会传递到外层代码,即不会有任何反应
- 作为参数的实例定义了catch(),一旦被rejected并不会触发Promise.all()的catch()
- Promise.reject()的参数会原封不动地作为rejected的理由,变成后续方法的参数
本文暂时没有评论,来添加一个吧(●'◡'●)