美文网首页
2021-07-11 Promise规范以及应用

2021-07-11 Promise规范以及应用

作者: 走花鹿 | 来源:发表于2021-07-11 14:27 被阅读0次

    PromiseA+规范

    大纲

    1. PromiseA+规范
    2. 实现一个promise
    3. generator async

    术语:

    1. promise是有then方法的对象或者函数
    2. thenable 是一个有then方法的对象或者是函数
    3. value是promise状态成功时的值, resolve(value), value可以是:string,number,boolean,undefined,thenable promise
    4. reason是promise状态失败时的值, reject(reason)
    5. exception 使用throw跑出的异常

    规范

    Promise States 有三种状态

    1. pending
      1.1 这是初始状态,可改变的;
      1.2 在resolve和reject前都处于这个状态;
      1.3 通过resolve -> fulfilled状态;
      1.4 通过reject-> rejected状态
    2. fulfilled
      2.1 这是最终态,不可变;
      2.2 一个promise被resolve之后会变成这个状态
      2.3 必须拥有一个value值
    3. rejected
      3.1 最终态,不可变;
      3.2 一个promise被reject之后会变成这个状态;
      3.3 必须拥有一个reason

    总结一下:
    pending -> resolve(value) -> fulfilled
    pending -> reject(reason) -> rejected

    then

    promiseA+规定promise应该提供一个then方法,用来访问最终的结果,无论value还是reason。

    promise.then(onFulfilled, onRejected)
    
    1. 参数规范
      1.1 onFulfilled必须是函数类型,如果传入的不是函数,应该被忽略。
      1.2 onRejected必须是函数类型,如果传入的不是函数,应该被忽略。
    2. onFulfilled特性
      2.1 在promise变成fulfilled时,应该调用onFulfilled,参数是value。(onFulfilled的执行时机)
      2.2 在promise变成fulfilled之前,不应该调用onFulfilled。
      2.3 只能被调用一次(怎么实现只调用一次?)。
    3. onRejected特性
      3.1 在promise变成rejected时,应该调用onRejected,参数是reason。
      3.2 在promise变成rejected之前,不应该调用onRejected。
      3.3 只能被调用一次。
    4. onFulfilled和onRejected应该是微任务阶段执行。
      实现promise的时候,如何去生产微任务?
    5. then方法可以被调用多次
      5.1 promise状态变成fulfilled之后,所有的onFulfilled回调都需要按住注册的顺序执行,也可以理解为按照.then的顺序执行。
      5.2 promise状态变成rejected之后,所有的onRejected回调都需要按住注册的顺序执行,也可以理解为按照.then的顺序执行。
    6. 返回值
      then应该返回一个promise
    const promise2 = promise.then(onFulfilled, onRejected)
    

    6.1 onFulfilled或onRejected执行结果为x,调用resolvePromise
    6.2 onFulfilled或onRejected执行过程中抛出了异常,promise2需要被rejected
    6.3 如果onFulfilled不是一个函数,promise2应该以promise1的value触发fulfilled
    6.4 如果onRejected不是一个函数,promise2应该以promise1的reason触发fulfilled

    1. resolvePromise
    resolvePromise(promise2, x, resolve, reject)
    

    7.1 如果promise2和x相等,reject typeError
    7.2 如果x是一个promise
    7.2.1 如果x是pending状态,promise必须要在pending状态,直到x的状态变更
    7.2.2 如果x是fulfilled,value->fulfilled
    7.2.3 如果x是rejected,reason->rejected
    7.3 如果x是一个Object/Function
    去获取x.then,如果报错reject reason
    then是一个函数,then.call(x, resolvePromiseFn, rejectPromiseFn)

    一步步实现一个Promise

    1. const promise = new Promise();,代表Promise应该是一个构造函数或者class
    2. 定义三种状态
    3. 初始化状态
    4. resolve和reject方法
      4.1 这两个方法要更改status,从pending编程fulfilled/ rejected
      4.2 入参分别是value/reason
    5. 对于实例化promise时的入参处理
      5.1 入参是一个函数,接收resolve reject两个参数
      5.2 初始化promise的时候,就要执行这个函数并且有任何的报错都要通过reject抛出去

      用try catch 初始化立刻执行
    6. then方法
      6.1 then接收两个参数,onFulfilled和onRejected
      6.2 检查并处理参数,如果参数不是函数,就忽略


      then方法

    相关文章

      网友评论

          本文标题:2021-07-11 Promise规范以及应用

          本文链接:https://www.haomeiwen.com/subject/kmykpltx.html