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 已拒绝');
        }
    );
相关推荐
前端小巷子24 分钟前
Webpack 5模块联邦
前端·javascript·面试
玲小珑27 分钟前
Next.js 教程系列(十九)图像优化:next/image 与高级技巧
前端·next.js
晓得迷路了28 分钟前
栗子前端技术周刊第 91 期 - 新版 React Compiler 文档、2025 HTML 状态调查、Bun v1.2.19...
前端·javascript·react.js
江城开朗的豌豆34 分钟前
Vue和React中的key:为什么列表渲染必须加这玩意儿?
前端·vue.js·面试
江城开朗的豌豆40 分钟前
前端路由傻傻分不清?route和router的区别,看完这篇别再搞混了!
前端·javascript·vue.js
pengzhuofan43 分钟前
Web开发系列-第0章 Web介绍
前端
小鱼人爱编程1 小时前
Java基石--反射让你直捣黄龙
前端·spring boot·后端
JosieBook2 小时前
【web应用】如何进行前后端调试Debug? + 前端JavaScript调试Debug?
前端·chrome·debug
LBJ辉2 小时前
2. Webpack 高级配置
前端·javascript·webpack
灵感__idea9 小时前
JavaScript高级程序设计(第5版):好的编程就是掌控感
前端·javascript·程序员