PromiseA+规范笔记(一)

145 阅读3分钟

前言

我们先了解下Promise规范的一些术语

术语

1.promsie 是一个有 then方法的对象或者是函数,行为遵循本规范

2.thenable 是一个有then 方法的对象或者是函数

3.vuale是 promise状态成功时的值, 也就是resolve的参数, 包括各种数据类型,也包括undefined、thenable、或者是promise

4.reason是promise状态失败时的值,也就是reject的参数,表示拒绝的原因

5.exception 是一个使用throw抛出的异常的值

Promise的状态

1.pending

  • 初始的状态, 可以改变
  • 一个promise 在resolve 或者reject前都处于这个状态
  • 可以通过 resolve -> fulfilled状态
  • 可以通过reject -> rejected状

2.fulfilled

  • 最终态,可以改变
  • 一个promise被resolve 后变成这个状态
  • 必须要拥有一个value值

3.rejected

  • 最终太,不可以改变
  • 一个promsie被rejected后会变成这个状态
  • 必须要拥有一个reason值

then

promise应该提供一个then方法,用来访问最终的结果,无论是value 还是reason 比如:

promise.then(onFulfilled, onRejected)

1.参数要求
  • onFulfilled 必须是函数类型,如果不是函数类型,应该被忽略
  • onRejected 必须是函数类型,如果不是函数,应该被忽略

2.onFulfilled 特性

  • 在promsie变成fulfilled时,应该调用 onFulfilled,参数是value
  • 在promise变成 fulfilled之前,不应该被调用
  • 只能被调用一次

3.nRejected 特性

  • 在promise变成 rejected 时,应该调用 onRejected, 参数是reason
  • 在promise变成 rejected 之前, 不应该被调用.
  • 只能被调用一次

4.onFulfilled 和 onRejected 应该是微任务

  • 这里用queueMicrotask来实现微任务的调用 queueMicrotask()在mdn查看;

5.then方法可以被调用多次

  • promise状态变成 fulfilled 后,所有的 onFulfilled 回调都需要按照then的顺序执行, 也就是按照注册顺序执行
  • promise状态变成 rejected 后,所有的 onRejected 回调都需要按照then的顺序执行, 也就是按照注册顺序执行

6.返回值

then 应该返回一个promise

promise2 = promise1.then(onFulfilled, onRejected);

  • onFulfilled 或 onRejected 执行的结果为x, 调用 resolvePromise
  • 如果 onFulfilled 或者 onRejected 执行时抛出异常e, promise2需要被reject
  • 如果 onFulfilled 不是一个函数, promise2 以promise1的value 触发fulfilled
  • 如果 onRejected 不是一个函数, promise2 以promise1的reason 触发rejected

7.Promise解决程序

resolvePromise(promise2, x, resolve, reject)

  1. 如果promise2 和x相等的时候,那么就要返回出 reject TypeError
  2. 如果 x是一个promise的话
  • 如果x是pending状态,那么promise必须保持pending状态,直到x被解决或拒绝
  • 如果x是fulfilled状态,那么要用相同的值解决promise
  • 如果x是rejected状态,用相同的原因拒绝promise

3.如果 x 是一个 object 或者 是一个 function

  • let then = x.then.
  • 如果检索属性x.then导致抛出了一个异常e,用e作为原因拒绝promise
  • 如果 then 是一个函数,用x作为this调用它。then方法的参数为俩个回调函数,第一个参数叫做resolvePromise,第二个参数叫做rejectPromise
    • resolvePromise用一个值调用 y, 则执行 resolvePromise(promise2, y, resolve, reject);

    • rejectPromise 用一个值调用 r, 用r拒绝promise

    • 如果 resolvePromise 和 rejectPromise 都调用了,那么第一个调用优先,后面的调用忽略。

    • 如果调用then则抛出异常e

    • 如果 resolvePromise 或 rejectPromise 已经被调用,则用e作为原因拒绝promis

  • 如果x不是一个对象或函数,则 resolve(x)