promise学习笔记

promise学习笔记

Promise A+ 规范

术语

  1. promise 有then 方法的对象或者函数
  2. thenable 是一个有then方法的对象或者是函数
  3. value promise 状态成功时的值, resolve(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

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 变成 fulfilled之前,不应该调用 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 需要被reject
6.3 如果onFulfilled 不是一个函数,promise2 以 promise1 的value 触发 fulfilled
6.4 如果 onRejected 不是一个函数, promise2 以 promise1 的reason 触发 fulfilled
  1. resolvepPomise
 resolvepPomise(promise2, x, resolve, reject)
7.1  如果promise2 和x相等,reject typeError
7.2 如果x 是一个promise
		如果x 是pending状态。 promise 必须要走pending 状态,直到 x的状态变更
		如果x 是 fulfilled, value -->  fulfilled
		如果 x 是 rejected , reason -- > rejected
 7.3  如果x 是一个Object 或者 Function 
         去获取 x.then(const then = x.then), 如果报错, reject reason
         如果 then 是 函数, 则去调用 then.call(x, resolvepPomiseFn, rejectpromiseFn);

第二部分

一步步实现一个Promise

  1. const promise = new Promise(); // 代表Promise 应该是一个构造函数或者 class
  2. 定义三种状态
  3. 初始化状态
  4. resolve 和 reject 方法
    4.1 这两个方法要更改status, 从 pending 变成 fulfilled / rejected;
    4.2 入参 分别是 value / resson。
  5. 对于实例化Promise 时的入参处理
    5.1 入参是一个函数, 接受resolve 和reject 两个参数
    5.2 初始化promise的时候,就需同步执行这个函数,并且有任何的报错都需要通过 reject抛出去
  6. then 方法
    6.1 入参定义 , then 接收两个参数, onFulfilled 和 onRejected
    6.2 检查并处理参数,如果参数不是函数,则忽略
    6.3 根据当前promise的状态,调用不同的函数
    6.4 首先我们要拿到所有的回调。新建两个数组,分别存储成功和失败的回调,调用then 的时候,如果还是 pending状态就存入数组
    6.5 在 status 发生变化的时候,执行回调。用到getter setter ,监听status的变化,在发生变化的时候来做对应的操作
  7. then的返回值
    7.1 如果onFulfilled 或者 onRejected 抛出一个异常额,那么新的promise必须 reject e;
    7.2 返回值应该是一个promise
    7.3 如果onFulfilled 不是函数,且promise1成功执行,promise2 必须返回同样的状态 和value
    7.4 如果onRejected 不是函数,且promise1拒绝执行,promise2 必须返回同样的状态 和reason
    7.5 如果onFulfilled 或者 onRejected 返回一个值x,运行resolvePromise方法。
  8. resolvePromise
  9. onFulfilled 和 onRejected 微任务

未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值