当前位置: 首页 > news >正文

Promise/A+ 规范中文解读

一、简介

Promise/A+ 是一个开放、健全且通用的JavaScript Promise标准,由开发者制定并供开发者参考。其核心目标是定义then方法的行为,确保不同Promise实现的互操作性。规范聚焦于异步操作的最终结果交互机制,而非Promise的创建、解决或拒绝方式。

二、术语

  1. Promise:拥有then方法且行为符合本规范的对象或函数。
  2. Thenable:定义then方法的对象或函数。
  3. 值(Value):任何合法的JavaScript值(包括undefined、thenable或Promise)。
  4. 异常(Exception):通过throw语句抛出的值。
  5. 拒因(Reason):Promise被拒绝时传递的原因。

三、 核心规范

3.1 Promise的状态

Promise必须处于以下三种状态之一:

  1. 等待态(Pending):可转换为兑现态(Fulfilled)或拒绝态(Rejected)。
  2. 成功态(Fulfilled):不可再改变状态;必须拥有一个不可变的终值(恒等性,即===判定)。
  3. 拒绝态(Rejected):不可再改变状态;必须拥有一个不可变的拒因(恒等性)。

3.2 then方法

Promise必须提供then方法以访问其终值或拒因:

promise.then(onFulfilled, onRejected)
3.2.1 参数规则
  1. 可选性
    • onFulfilledonRejected均为可选参数,非函数类型需被忽略。
  2. 调用条件
    • onFulfilled在Promise兑现后调用,接收终值作为首个参数,且仅调用一次。
    • onRejected在Promise拒绝后调用,接收拒因作为首个参数,且仅调用一次。
  3. 异步执行
    • 回调需在执行栈仅含平台代码时调用(即异步执行,通常通过微任务队列实现)。
3.2.2 多次调用与顺序
  • 同一Promise可多次调用then,回调按注册顺序执行。
3.2.3 返回值
  • then必须返回新Promise(promise2),其状态由以下规则决定:
    1. 若回调返回普通值x,执行[[Resolve]](promise2, x)
    2. 若回调抛出异常epromise2需拒绝并传递e
    3. onFulfilled非函数且原Promise兑现,promise2需以相同终值兑现。
    4. onRejected非函数且原Promise拒绝,promise2需以相同拒因拒绝。

3.3 Promise解决过程

抽象操作[[Resolve]](promise, x)决定如何根据x的类型处理Promise的状态:

3.3.1 步骤
  1. 循环引用检测
    • promisex为同一对象,以TypeError拒绝。
  2. 处理Promise实例
    • x为Promise,直接继承其状态。
  3. 处理Thenable对象
    • x为对象或函数:
      1. 尝试获取x.then,若获取过程抛出异常e,以e拒绝Promise。
      2. then为函数,以x为上下文调用,并传入resolvePromiserejectPromise
        • resolvePromise(y)被调用,递归执行[[Resolve]](promise, y)
        • rejectPromise(r)被调用,以r拒绝Promise。
        • 仅首次调用生效,后续调用被忽略。
  4. 非Thenable值
    • x非对象或函数,直接以x兑现Promise。
3.3.2 循环引用处理
  • 若检测到thenable链导致无限递归,鼓励(但不强制)实现以TypeError拒绝。

四、注释与实现细节

  1. 平台代码:指引擎、环境及Promise实现本身的代码,确保回调异步执行(如通过微任务队列)。
  2. 严格模式onFulfilledonRejected需作为普通函数调用(无this绑定)。
  3. 历史兼容性:规范基于早期Promise/A提案,明确行为并剔除不明确或有问题的部分。

五、总结

Promise/A+规范通过标准化then方法,为异步操作提供了可预测的行为模型。其核心在于状态机管理、回调调度及递归解决逻辑,确保了不同实现的互操作性。开发者可通过遵循此规范,构建健壮且一致的异步处理机制。

六、 参考与扩展

  • 官方英文原版:
    • Promises/A+ Specification
  • 推荐实现库:
    • es6-promisebluebirdQ.js 等均遵循此规范。
http://www.xdnf.cn/news/414739.html

相关文章:

  • Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解
  • 【C语言指针超详解(五)】--回调函数,qsort函数的理解和使用,qsort函数的模拟实现
  • 类神经网络训练失败怎么办?
  • 中央处理器(CPU)(概述、指令周期)
  • 阿里云服务器核心用途解析:从基础应用到行业创新​
  • c++刷题便捷函数(类似于stoi的小函数)
  • 超越合并速度(merge speed):AI如何重塑开发者协作
  • Hadoop集群的常用命令
  • axi uart 16550 ip core使用流程
  • 一、HAL库的设计理念详解:从架构到实践
  • 274、H指数
  • StringBuilder,StringJoiner,StringBuffer字符串处理类深度解析
  • 从零到精通:GoFrame 的 garray 模块深度解析与实战经验分享
  • Nacos源码—8.Nacos升级gRPC分析五
  • 【K8S学习之生命周期钩子】详细了解 postStart 和 preStop 生命周期钩子
  • 【日撸 Java 三百行】Day 13(链表)
  • 【AIGC梦幻婚纱美学】:白纱与花卉的浪漫算法融合
  • 2025-5-12 底部埋伏记录
  • Matlab 基于GUI的图像去雾技术GlobalHisteq、LocalHisteq和Retinex
  • 基于世界土壤数据库(HWSD)的中国土壤数据集(v1.1)(2009)
  • 大核极坐标码
  • vulhub-Stapler
  • 耀圣-高温釜进料口气动耐磨切断球阀:高粘度、高腐蚀颗粒介质的终极进料解决方案
  • DeepSeek | AI需求分析
  • 手机电池健康提示怎么看?
  • 封装echarts的柱状图+折线图+堆积图
  • 使用 Watt toolkit 加速 git clone
  • 栈和队列复习(C语言版)
  • 判断一个数组有没有重复值
  • k8s监控方案实践(三):部署与配置Grafana可视化平台