专业的编程技术博客社区

网站首页 > 博客文章 正文

JavaScript异步执行解决方案之promise基础知识

baijin 2024-08-19 11:29:56 博客文章 4 ℃ 0 评论

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的理由,变成后续方法的参数

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表