promise a+ 规范

根据我的个人理解,与实际有偏差

术语

  • Promise 是一个拥有 then 方法的对象或函数;
  • thenable 是一个定义了 then 方法的对象或函数;
  • value 指任何 JavaScript 的合法值(包括 undefined , thenable 和 promise);
  • exception 是使用 throw 语句抛出的一个值;
  • reason 表示一个 promise 的拒绝原因。

Promise

  • 共三种状态:pending 等待,fulfilled 完成,rejected 拒绝;
  • 处于 pending 可转换为 fulfilledrejected
  • 处于 fulfilled 不可再改变,且有一个不可变的 value
  • 处于 rejected 不可再改变,且有一个不可变的 reason

then

一个 Promise 必须提供一个 then 方法以访问当前值(valuereason);
then 方法接受两个可选参数,如果该参数不是函数则被忽略:

promise.then(onFulfilled, onRejected);
  • onFulfilled
    • Promise 状态为 pending 时不可调用;
    • Promise 状态为 fulfilled 被调用,其第一个参数是当前 value
    • 只执行一次。
  • onRejected
    • Promise 状态为 pending 时不可调用;
    • Promise 状态为 onRejected 被调用,其第一个参数是当前 reason
    • 只执行一次。
  • 调用时机:异步执行;
  • 调用要求:作为函数调用(即严格模式下 thisundefined,非严格模式下 thiswindow);
  • 多次调用
    • Promisefulfilled 时,所有 onFulfilled 函数按顺序执行;
    • Promiserejected 时,所有 onRejected 函数按顺序执行。
promise1.then(onFulfilled, onRejected);
promise1.then(onFulfilled, onRejected);
promise1.then(onFulfilled, onRejected);
...
  • 返回:必须返回一个 Promise 对象

    • 如果 onFulfilledonRejected 返回一个值 x,则运行 resolvePromise
    • 如果 onFulfilledonRejected 抛出异常 reason,则 promise2 状态为 rejected,并且当前值为reason
    • 如果 onFulfilledonRejected 不为函数,则 promise2promise1 的状态与值;
promise2 = promise1.then(onFulfilled, onRejected);

resolvePromise

promise2 = promise1.then(value => value);

resolvePromise(promise2, value)

主要是用来解决 value 是一个 Promise 对象的情况。

  1. valuepromise2 是同一个对象,则抛出异常;

  2. 如果 value 是一个 Promise 对象

    1. value 处于 pending,返回的 promise 保持 pending,直到 value 状态改变;
    2. 否则用相同的状态和值执行。
  3. 如果 value 是一个对象或函数

    1. value.then 赋值给 then
    2. 如果 then 是一个函数,将 value 绑定为该函数 this 并执行,第一个参数为 onFulfilled,第二个参数为 onRejected
      1. onFulfilled 返回 y,则继续执行 resolvePromise
      2. onRejected 返回 z,返回的 promisez 执行拒绝;
    3. 如果 then 是一个对象,返回的 promisevalue 执行完成;
    4. 以上操作抛出异常 reason,返回的 promisereason 执行拒绝;
  4. 否则返回的 promisevalue 执行完成。

posted @   梦渊同学  阅读(129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示