关于javascript:PromiseA规范

47次阅读

共计 2111 个字符,预计需要花费 6 分钟才能阅读完成。

PromiseA+ 标准

术语

  1. promise 是一个有 then 办法的对象或者函数,行为遵循 PromiseA+ 标准
  2. thenable 是一个有 then 办法的对象或者函数
  3. value 是 Promise 状态胜利时的值,也是 resolve 的参数,包含各种数据类型,undefined / string / number / boolean / promise …
  4. reason 是 Promise 状态失败时的值,也就是 reject 的参数,示意回绝的起因
  5. exception throw 抛出去的异样

标准

Promise States

promise 有三种状态,要留神他们之间的关系

  1. pending
    1.1 初始状态,能够扭转
    1.2 一个 promise 在被 resolve 或者 reject 之前,都处于这个状态
    1.3 通过 resolve -> fulfilled
    1.4 通过 reject -> rejected
  2. fulfilled
    2.1 最终态,不能够扭转
    2.2 一个 promise 在被 resolve 之后变成这个状态
    2.3 必须有一个 value 值 // undefined
  3. rejected
    3.1 最终态,不能够扭转
    3.2 一个 promise 在被 reject 之后变成这个状态
    2.3 必须有一个 reason 值 // undefined

pending -> resolve(value) -> fulfilled
pending -> reject(reason) -> rejected

then

promise 应该提出一个 then 办法,用来拜访最终的后果,无论是 value 还是 reason。

    promsie.resolve(onfulfilled, onrejected);
  1. 参数要求
    1.1 onfulfilled 必须是函数类型,如果不是函数,应该被疏忽
    1.2 onrejected 必须是函数类型,如果不是函数,应该被疏忽
  2. onfulfilled 个性
    2.1 在 promise 变成 fulfilled 后,应该调用 onfulfilled,参数是 value
    2.2 在 promise 变成 fulfilled 前,不应该被调用
    2.3 只能被执行一次
  3. onrejected 个性
    3.1 在 promise 变成 rejected 后,应该调用 onrejected,参数是 reason
    3.2 在 promise 变成 rejected 前,不应该被调用
    3.3 只能被执行一次
  4. onfulfilled 和 onrejected 应该是微工作
    queueMicrotask 实现微工作的调用
  5. then 办法能够被调用屡次
    5.1 promise 变成 fulfilled 后,所有 onfulfilled 回调都应该依照 then 的程序执行

     在实现 promsie 的时候,咱们须要一个数组来存储 onfulfilled 的 cb
        promise.then(cb1).then(cb2).then(cb3)...
        // or
        const promise = new Promsie();
        promise.then(cb1);
        promise.then(cb2);
        // 

    5.2 promise 变成 rejected 后,所有 onrejected 回调都应该依照 then 的程序执行

     在实现 promsie 的时候,咱们须要一个数组来存储 onrejected 的 cb
  6. 返回值
    then 的返回值是一个 promise,新的?旧的?

        promsie2 = promise1.then(onfulfilled, onrejected)

    6.1 onfulfilled 和 onrejected 执行的后果为 x,调用 resolvePromise
    6.2 onfulfilled 和 onrejected 执行的异样,promsie2 须要被 rejected
    6.3 如果 onfulfilled 不是一个函数,promsie2 以 promise1 的 value 触发 fulfilled
    6.4 如果 onrejected 不是一个函数,promsie2 以 promise1 的 reason 触发 rejected

  7. resolvePromise

        resolvePromsie(promise2, x, resolve, reject);

    7.1 如果 promise2 和 x 相等,那么 reject typeError 会死造成死循环, 为什么???
    7.2 如果 x 是 promise

     如果 x 是 pending,promise 的状态必须也是期待 /pending,晓得 x 变成了 fulfilled / rejected
     如果 x 是 fulfilled,fulfilled promise width the same value  值的透传
     如果 x 是 rejected,reject promise width the same reason 

    7.3 如果 x 是一个 object 或者是一个 function

     let then = x.then;
     如果 x.then 这一步出错了,try catch(e), reject(e)     ** 如果是一个 object 怎么可能会出错???**
     如果 then 是一个函数,then.call(x, resolvePromsieFn, rejectedPromiseFn);
    
     resolvePromsieFn 入参 y,执行 resolvePromsie(promise2, y, resolve, reject);
     如果调用 then 的时候抛出了异样 e,reject reason

正文完
 0