Promise的两个阶段,三种状态

114 阅读2分钟

什么是promise

  • Promise是一个由异步函数返回的可以向我们指示当前操作所处的状态的对象
  • Promise是一个ES6提供的类,目的是更加优雅地书写复杂的异步任务,避免层层嵌套的回调地狱
  • Promise是一个表示异步操作最终完成或失败的对象,并可以通过链式调用来处理操作的结果

promise的特点

两个阶段

  • unsettled: 未决阶段,表示事情还在进行前期的处理,并没有发生通向结果的那件事

  • settled:已决阶段,Promise进入的最终阶段,表示异步操作已经完成或失败,整件事情无法逆转

    事情总是 未决阶段逐步发展到已决阶段的。并且,未决阶段拥有控制何时通向已决阶段的能力。

三种状态

  • pending: 初始状态,表示异步操作正在进行中,还没有完成或失败

  • fulfilled:表示异步操作成功完成,并且返回了一个值

  • rejected:已拒绝,reject函数将Promise推向已决阶段的rejected状态

    Promise的状态转换是单向的,一旦进入Settled状态(即Fulfilled或Rejected状态),就不可再改变

  • 当事情达到已决阶段后,通常需要进行后续处理,不同的已决状态,决定了不同的后续处理。

    • resolved状态:这是一个正常的已决状态,后续处理表示为 thenable
    • rejected状态:这是一个非正常的已决状态,后续处理表示为 catchable

    后续处理可能有多个,因此会形成作业队列,这些后续处理会按照顺序,当状态到达后依次执行

const pro = new Promise((resolve, reject)=>{
    // 未决阶段的处理
    // 通过调用resolve函数将Promise推向已决阶段的resolved状态
    // 通过调用reject函数将Promise推向已决阶段的rejected状态
    // resolve和reject均可以传递最多一个参数,表示推向状态的数据
})
pro.then(data=>{
    //这是thenable函数,如果当前的Promise已经是resolved状态,该函数会立即执行
    //如果当前是未决阶段,则会加入到作业队列,等待到达resolved状态后执行
    //data为状态数据
}, err=>{
    //这是catchable函数,如果当前的Promise已经是rejected状态,该函数会立即执行
    //如果当前是未决阶段,则会加入到作业队列,等待到达rejected状态后执行
    //err为状态数据
})