promiseA+规范-学习笔记

目录

术语

Promise States

then


术语

  1. promise 是一个有then 方法的对象或者函数,行为遵循本规范
  2. thenable 是一个有then 方法的对象或者函数
  3. value 是promise 状态成功时的值,也就是resolve的参数,包括各种数据类型,也包括undefined / thenable或者是promise
  4. reason 是promise 状态失败时的值,也就是reject的参数,表示拒绝的原因
  5. exception 是一个使用throw 抛出的异常值

Promise States

Promise应该有三种状态,要注意他们之间的流转关系

  1. pending
    1. 初识的状态,可改变
    2. 一个promise 在resolve 或者reject 前都处于这个状态
    3. 可以通过 resolve => fulfilled 状态
    4. 可以通过 rehect => rejected 状态
  2. fulfilled
    1. 最终态,不可变
    2. 一个promise 被resolve 后会变成这个状态
    3. 必须拥有一个value 值
  3. rejected
    1. 最终态,不可变
    2. 一个promise 被reject 后会变成这个状态
    3. 必须拥有一个reason

总结:promise的状态流转是这样的

  • pending => resolve(value) => fulfilled
  • pending => reject(reason) => rejected

then

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

promise.then(onFulfilled, onRejected);
  1. 参数要求
    1. onFulfilled 必须是函数类型,如果不是函数,应该被忽略
    2. onRejected 必须是函数类型,如果不是函数,应该被忽略
  2. onFulfilled 特性
    1. 在promise 变成fulfilled 时,应该调用onFulfilled,参数是value
    2. 在promise 变成fulfilled之前,不应该被调用
    3. 只能被调用一次(所以在实现的时候需要一个变量来限制执行次数)
  3. onRejected 特性
    1. 在promise 变成rejected 时,应该调用onRejected,参数是reason
    2. 在promise 变成rejected 之前,不应该被调用
    3. 只能被调用一次(所以在实现的时候需要一个变量来限制执行次数)
  4. onFulfilled 和 onRejected 应该是微任务
    1. 这里用queueMicrotask来实现微任务的调用
      queueMicrotask(() => {
          // 实现微任务调用
      })
  5. then 方法可以被调用多次

    1. promise 变成fulfilled / rejected 后,所有的onFulfilled / onRejected 回调都需要按照then 的顺序执行,也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onFulfilled / onRejected 的回调)

  6. 返回值
    then 应该返回一个promise

    promise2 = promise1.then(onFulfilled, onRejected);
    1. onFulfilled 或 onRejected 执行结果为x,调用 resolvePromise(下面细讲一下 resolvePromise 是什么东西)

    2. 如果onFulfilled 或者 onRejected 执行时抛出异常e,promise2需要被reject

    3. 如果onFulfilled 不是一个函数,promise2 以promise1 的 value 触发fulfilled

    4. 如果onRejected 不是一个函数,promise2 以promise1的reason 触发rejetced

  7. resolvePromise
    resolvePromise(promise2, x, resolve, reject);
     
    1. 如果promise2 和 x 相等,那么reject TypeError
    2. 如果 x 是一个 promise
      1. 如果x 是pending,那么promise必须要在pending,直到x 变成fulfilled or rejected.
      2. 如果x 被fulfilled,fulfill promise with the same value.
      3. 如果x 被 rejected,reject promise with the same reason.
    3. 如果x 是一个 object 或者是一个 funciton
      let then = x.then;
      1. 如果x.then 这步出错,那么 reject promise with e as then reason.

      2. 如果then是一个函数

        the.call(x, resolvePromiseFn, rejectPromise);

        resolvePromiseFn的入参是y,执行

        resolvePromise(promise2, y, resolve, reject);

        rejectPromise 的入参是 r, reject promise with r.

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

      4. 如果调用then抛出异常e
        如果resolvePromise 或 rejectPromise 已经被调用,那么忽略
        则,reject promise with e as the reason

      5. 如果then 不是一个funciton.fulfill promise with x.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清梦-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值