Promise A+ 规范解读

前言

任何符合 promise 规范的对象或函数都可以成为 promise,promise A plus 规范地址:promisesaplus.com/

术语

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

promise 的状态

一个 Promise 的当前状态必须为以下三种状态中的一种:等待态(Pending)、已完成(Fulfilled)和已拒绝(Rejected)。

  • 处于等待态时,promise 需满足以下条件:可以变为「已完成」或「已拒绝」
  • 处于已完成时,promise 需满足以下条件:
    • 不能迁移至其他任何状态
    • 必须拥有一个不可变的值
  • 处于已拒绝时,promise 需满足以下条件:
    • 不能迁移至其他任何状态
    • 必须拥有一个不可变的原因

必须有一个 then 方法

一个 promise 必须提供一个 then 方法以访问其当前值和原因。 promise 的 then 方法接受两个参数:promise.then(onFulfilled, onRejected) 他们都是可选参数, 同时他们都是函数,如果 onFulfilled 或 onRejected 不是函数,则需要忽略他们。

  • 如果 onFulfilled 是一个函数
    • 当 promise 执行结束后其必须被调用,其第一个参数为 promise 的值
    • 在 promise 执行结束前其不可被调用
    • 其调用次数不可超过一次
  • 如果 onRejected 是一个函数
    • 当 promise 被拒绝执行后其必须被调用,其第一个参数为 promise 的原因
    • 在 promise 被拒绝执行前其不可被调用
    • 其调用次数不可超过一次

其他规则

  • 在执行上下文堆栈仅包含平台代码之前,不得调用 onFulfilled 或 onRejected
  • onFulfilled 和 onRejected 必须被作为普通函数调用(即非实例化调用,这样函数内部 this 非严格模式下指向 window)
  • then 方法可以被同一个 promise 调用多次
    • 当 promise 成功执行时,所有 onFulfilled 需按照其注册顺序依次回调
    • 当 promise 被拒绝执行时,所有的 onRejected 需按照其注册顺序依次回调
  • then 方法必须返回一个 promise 对象 promise2 = promise1.then(onFulfilled, onRejected);
    • 只要 onFulfilled 或者 onRejected 返回一个值 x,promise 2 都会进入 onFulfilled 状态
    • 如果 onFulfilled 或者 onRejected 抛出一个异常 e,则 promise2 必须拒绝执行,并返回拒因 e
    • 如果 onFulfilled 不是函数且 promise1 状态变为已完成,promise2 必须成功执行并返回相同的值
    • 如果 onRejected 不是函数且 promise1 状态变为已拒绝,promise2 必须执行拒绝回调并返回相同的据因
javascript 复制代码
var promise1 = new Promise((resolve, reject) => {
    reject();
});
const promise2 = promise1
   .then(null, function() {
        return 123
    });

promise2
   .then(
        () => {
            console.log('promise2 已完成');
        },
        () => {
            console.log('promise2 已拒绝');
        }
    );
相关推荐
DianSan_ERP3 小时前
电商架构演进:如何在高并发场景下实现多平台API的标准化履约?
运维·前端·网络·安全·架构·自动化
碎_浪6 小时前
给键盘党的英语记忆工具:我做了一款「打字背单词」桌面应用
前端·程序员·ai编程
阿成学长_Cain7 小时前
Linux dirs命令详解|Bash目录堆栈管理快速切换目录实战教程
linux·运维·前端·数据库
多加点辣也没关系7 小时前
JavaScript|第4章:类型转换
开发语言·javascript
yqcoder7 小时前
httpOnly 是什么,又有什么用?
开发语言·前端·javascript
IT_陈寒7 小时前
Java的Stream.parallel()把我CPU跑爆了,这种优化要谨慎
前端·人工智能·后端
小皮虾7 小时前
小程序首页性能优化实战:从 4 秒到 1.8 秒
前端·微信小程序
烬羽8 小时前
还在手动拼路径、写回调地狱?一文吃透 Node.js 的 path 和 fs
javascript·程序员·node.js
山河木马8 小时前
GPU自动处理专题1-裁剪到底在裁什么(裁剪)
前端·webgl·计算机图形学