当前位置: 首页 > 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 等均遵循此规范。

相关文章:

Promise/A+ 规范中文解读

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

多媒体预研

主要包含h265 av1 等各种 多媒体的具体应用 svac_plugin ZLMediaKit/ext-codec at master cyf88/ZLMediaKit D:\java\xiachu\otherzlm\ZLMediaKit> sip-client GB28181-Service/SipClient at master Washington-DC/GB28181-Service yolo Jackson-Tan/wvp_pro_yolo: 小…...

动态网站 LNMP

一、名词解释: LNMP: L : 代表 Linux 操作系统,为网站提供了可靠的运行环境N : 代表 Nginx,它是一款轻量级的高性能 Web 服务器,能够快速处理大量并 发连接,有效提升网站的访问速度和性能 M : 代表…...

【Leetcode刷题随笔】349. 两个数组的交集

1. 题目描述 给定两个数组nums1和nums2&#xff0c;返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。 示例1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 题目条件&#xff1a; 1 < nums1.length, nums2.length < 10…...

如何优雅的使用CMake中的FindPkgConfig模块

背景 如果你遇到下面的场景&#xff0c;那么FindPkgConfig模块可以用来解决我们引用上游库的问题。 上游库没有提供CMake的配置文件。CMake没有提供相应的查找模块&#xff0c;即Find<PackageName>.cmake的文件。上游库提供了pkg-config使用的.pc文件。 如果上面三个条…...

Docker Volumes

Docker Volumes 是 Docker 提供的一种机制&#xff0c;用于持久化存储容器数据。与容器的生命周期不同&#xff0c;Volumes 可以独立存在&#xff0c;即使容器被删除&#xff0c;数据仍然保留。以下是关于 Docker Volumes 的详细说明&#xff1a; 1. 为什么需要 Volumes&#…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

day23 机器学习管道 Pipeline

在机器学习中&#xff0c;数据预处理、特征提取、模型训练和评估等步骤通常是按顺序执行的。为了更高效地管理和复用这些步骤&#xff0c;我们可以使用 Pipeline&#xff08;管道&#xff09;来构建一个完整的机器学习流水线。本文将详细介绍 Pipeline 的基础概念&#xff0c;并…...

The Graph:区块链数据索引的技术架构与创新实践

作为Web3生态的核心基础设施&#xff0c;The Graph通过去中心化索引协议重塑了链上数据访问的范式。其技术设计不仅解决了传统区块链数据查询的效率瓶颈&#xff0c;还通过经济模型与多链兼容性构建了一个开放的开发者生态。本文从技术角度解析其架构、机制及创新实践。 一、技…...

nginx配置sse流传输问题:直到所有内容返回后才往下传输

一、禁用缓冲&#xff08;如实时流传输&#xff09;&#xff1a; location /stream {proxy_buffering off; } 二、开启分块传输 location /your-path {proxy_chunked_transfer_encoding on; # 显式启用分块传输&#xff08;默认已启用&#xff09; }...

使用Daemonset部署日志收集守护进程

1.DaemonSet简介&#xff1a; 在Kubernetes&#xff08;简称k8s&#xff09;中&#xff0c;DaemonSet是一种控制器&#xff0c;用于确保集群中的每个&#xff08;或部分&#xff09;节点运行一个指定的Pod副本。DaemonSet非常适合需要全局部署、节点级运行的服务&#xff0c;如…...

在Mac环境下搭建Docker环境的全攻略

在Mac环境下搭建Docker环境的全攻略 在现代软件开发中&#xff0c;Docker已经成为不可或缺的工具之一。它不仅简化了应用的部署和管理&#xff0c;还极大地提升了开发效率。然而&#xff0c;在某些公司环境中&#xff0c;桌面版的Docker可能会被禁用&#xff0c;这给开发工作带…...

Go 语言 slice(切片) 的使用

序言 在许多开发语言中&#xff0c;动态数组是必不可少的一个组成部分。在实际的开发中很少会使用到数组&#xff0c;因为对于数组的大小大多数情况下我们是不能事先就确定好的&#xff0c;所以他不够灵活。动态数组通过提供自动扩容的机制&#xff0c;极大地提升了开发效率。这…...

C++ string比较、string随机访问、string字符插入、string数据删除

string的字符串进行比较&#xff0c;代码见下。 #include<iostream>using namespace std;int main() {// 1 comparestring s1 "aab";string t11 "aab";int r11 s1.compare(t11);cout << "1: " << r11 << endl;strin…...

web 自动化之 Unittest 应用:测试报告装饰器断言

文章目录 一、常见的第三方库结合 unittest 生产 html 格式测试报告1、HtmlTestRunner2、BeatifulReport 二、装饰器 unittest.skip 强制跳过&条件跳过三、unittest的常用断言方法 一、常见的第三方库结合 unittest 生产 html 格式测试报告 1、HtmlTestRunner 官网下载 …...

前端基础之《Vue(16)—Vue脚手架介绍》

一、脚手架环境 1、推荐windows10 Node vue/cli(webpack) 2、测试node安装成功 node -v npm -v 3、什么是脚手架 Vue CLI&#xff1a;CLI就是脚手架的意思 脚手架生成一套模板&#xff08;入口文件、配置文件、目录结构&#xff09; 4、常用的包管理器 npm&#xff1a;no…...

MySQL 事务(一)

文章目录 CURD不加控制&#xff0c;会有什么问题CURD满足什么属性&#xff0c;能解决上述问题&#xff1f;什么是事务为什么要有事务事务的版本支持了解事务的提交方式 事务常见操作方式研究并发场景事务的正常操作事务的非正常情况的案例结论事务操作的注意事项 CURD不加控制&…...

Dsp38335利用Bootloader实现在线升级的技术原理

1. Bootloader概述 Bootloader&#xff08;引导加载程序&#xff09;是嵌入式系统中负责在设备启动时加载和启动主程序的代码。它通常在系统的闪存或其他非易失性存储器中&#xff0c;并在系统上电时首先执行。Bootloader不仅完成启动操作&#xff0c;还能够提供后续的程序升级…...

【TVM 教程】microTVM PyTorch 教程

Apache TVM 是一个深度的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者&#xff1a;Mehrdad Hessar 该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用…...

利用D435i相机进行SLAM实现建图的关键环节-----Kalibr标定工具以及常见的问题调试

在SLAM系统中&#xff0c;相机标定是获取准确的空间信息和三维重建的关键步骤。对于Intel RealSense D435i这类双目相机&#xff0c;正确的内参和外参不仅能提高位姿估计精度&#xff0c;还能显著改善重建效果。本文将详细介绍如何使用Kalibr对D435i进行双目标定&#xff0c;并…...

old kali网站下载链接爬取-Kali linux 全部版本镜像下载--Index of /kali-images

Kali linux 全部版本镜像下载 目的 出于该网站不稳定原因&#xff0c;故爬取下载链接&#xff0c;以便网友下载老版本kali from bs4 import BeautifulSoup import requests from urllib.parse import urljoinbase_url "http://old.kali.org/kali-images/" visite…...

基于千眼狼高速摄像机与三色掩模的体三维粒子图像测速PIV技术

研究背景 航空航天、能源动力领域&#xff0c;测量三维瞬态流场的速度场信息对于理解流体力学行为、优化系统设计非常关键。 传统三维粒子图像测速技术如Tomo层析PIV&#xff0c;因依赖多相机阵列&#xff0c;存在系统体积、操作复杂&#xff0c;在封闭空间测量存在困难&#…...

Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用--程序启动界面

前期使用Tauri(2.5.1)Leptos(0.7.8)写了一个自用桌面小程序&#xff0c;详见&#xff1a;使用Tauri 2.3.1Leptos 0.7.8开发桌面小程序汇总_tauri 小程序-CSDN博客。 在此基础上&#xff0c;尝试给程序添加启动界面&#xff0c;效果如下图所示。 1. 添加启动画面设置 在src-ta…...

Gmsh划分网格|四点矩形

先看下面这段官方自带脚本 /*********************************************************************** Gmsh tutorial 1** Variables, elementary entities (points, curves, surfaces), physical* entities (points, curves, surfaces)********************************…...

I/O多路复用(select/poll/epoll)

通过一个进程来维护多个Socket&#xff0c;也就是I/O多路复用&#xff0c;是一种常见的并发编程技术&#xff0c;它允许单个线程或进程同时监视多个输入/输出&#xff08;I/O&#xff09;流&#xff08;例如网络连接、文件描述符&#xff09;。当任何一个I/O流准备好进行读写操…...

一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!

从事企业软件项目开发的同学们一定对 ER 图很熟悉&#xff0c;可以帮助用户快速厘清数据库结构&#xff0c;方便后续维护和优化。但是在日常工作中&#xff0c;面对复杂的数据结构&#xff0c;整理表设计文档对于每一位DBA来说都很头大&#xff0c;需要将设计细节转化为条理清晰…...

学习黑客 windows 设置与控制面板详解

Windows 设置与控制面板详解&#xff1a;双剑合璧的系统配置工具 ⚙️&#x1f527; 学习目标&#xff1a;理解Windows设置和控制面板的异同、掌握系统配置的安全最佳实践 1. 引言&#xff1a;双界面的系统配置世界 &#x1f310; 在Windows操作系统中&#xff0c;有两个强大的…...

pytorch模型画质增强简单实现

使用数据增强技术可以增加数据集中图像的多样性&#xff0c;从而提高模型的性能和泛化能力&#xff0c;主要的图像增强技术包括。 亮度&#xff0c;对比度调节 在开始图像大小的调整之前我们需要导入数据&#xff08;图像以眼底图像为例&#xff09;。 from PIL import Image f…...

C++中的std::allocator

C中的std::allocator 文章目录 C中的std::allocator1.std::allocator1.1C中的placement new 和operator new1.2一个custom allocator的实现1.3使用std::allocator_traits实现allocator 1.std::allocator C中的std::allocator默默工作在CSTL中的所有容器的内存分配上&#xff0…...

Linux文件编程——read函数与lseek函数

一、read函数 在 Linux 文件编程中&#xff0c;read 函数是一个系统调用&#xff0c;用于从文件描述符&#xff08;File Descriptor&#xff09;指向的文件或设备中读取数据到缓冲区。它是 Unix/Linux 系统编程中实现底层 I/O 操作的核心函数之一。以下是 read 函数的详细使用…...

STM32 变量存储

一、存储区划分与变量分类 STM32的存储空间分为Flash&#xff08;非易失性&#xff09;和RAM&#xff08;易失性&#xff09;两大区域&#xff1a; ​Flash存储器 ​代码段&#xff08;Code&#xff09;​&#xff1a;存储程序指令和常量&#xff08;如字符串、const变量&…...

解锁性能密码:Linux 环境下 Oracle 大页配置全攻略​

在 Oracle 数据库运行过程中&#xff0c;内存管理是影响其性能的关键因素之一。大页内存&#xff08;Large Pages&#xff09;作为一种优化内存使用的技术&#xff0c;能够显著提升 Oracle 数据库的运行效率。本文将深入介绍大页内存的相关概念&#xff0c;并详细阐述 Oracle 在…...

HashMap中哈希值与数组坐标的关联

目录 1、哈希值的生成与处理 2、计算桶的索引 3、哈希值总结 4、哈希冲突解决方案 4.1. 拉链法&#xff08;Separate Chaining&#xff09; 4.2. 开放寻址法&#xff08;Open Addressing&#xff09; 1、线性探测&#xff08;Linear Probing&#xff09; 2、二次探测&a…...

GBK与UTF-8编码问题(1)

1. 问题现象 我们在编译.py的python代码时&#xff0c;有时会遇到如下图这种问题。提示说“SyntaxError: (unicode error) ‘utf-8’ codec can’t decode byte 0xc4 in position 0: invalid continuation byte”&#xff0c;代码中有中文字符&#xff0c;这似乎和文件的编码方…...

大模型的实践应用41-天气预测与分析决策系统:Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用41-Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法研发天气预测与分析决策系统。本项目构建一个基于大模型Qwen3(32B)、LangChain框架、MCP协议、RAG技术以及传统算法的天气预测与分析决策系统。该系统通…...

单片机学习Day08--相邻流水灯

一&#xff0c;题目&#xff1a;同时点亮相邻的两个灯&#xff0c;并实现流水设计。 亮的是0&#xff1b; 最前面是LED8. #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void mai…...

邮件营销应对高退信率的策略

一、邮件列表管理 1. 使用专业工具验证 借助如 Geeksend 邮箱验证等专业工具&#xff0c;全面清洗邮件列表&#xff0c;剔除无效、过期或格式错误的邮箱地址&#xff0c;确保邮件精准送达有效收件人&#xff0c;从而降低退信率。 2. 定期清理无效地址 将定期清理邮件列表纳入…...

无线定位之 三 SX1302 网关源码 thread_gps 线程详解

前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…...

Java项目层级介绍 java 层级 层次

java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository &#xff1a;数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中&#xff0c;层级结构&#xff08;Layered Architecture&#xf…...

【操作系统】零拷贝技术

1. DMA技术 DMA技术也就是直接内存访问技术。在进行I/O设备和内存的数据传输的时候&#xff0c;数据传输的工作全部交给DMA控制器&#xff0c;而不是CPU负责。 2. 传统的文件传输 传统的文件传输的代码如下&#xff1a; read(file, tmp_buf, len); write(socket, tmp_buf,…...

从零构建高性能桌面应用:GPUI Component全解析与实战指南

简介 高性能UI组件库正在重塑桌面应用开发的格局,而GPUI Component作为新兴的Rust桌面UI组件库,凭借其卓越的跨平台支持能力、GPU加速渲染和企业级功能特性,正成为构建现代化高性能桌面应用的首选。本文将从零开始,全面解析GPUI Component的核心特性、安装配置流程,并通过…...

java 中 DTO 和 VO 的核心区别

DTO 和 VO 的核心区别 特性DTO&#xff08;数据传输对象&#xff09;VO&#xff08;视图对象&#xff09;设计目的服务层与外部系统&#xff08;如前端、其他服务&#xff09;之间的数据传输为前端展示层定制数据&#xff0c;通常与 UI 强绑定数据内容可能包含业务逻辑需要的字…...

bazel迁移cmake要点及具体迁移工程示例(apollo radar)

文章目录 bazel迁移cmake要点及具体迁移工程示例迁移要点指南依赖库管理proto编译目标库及二进制文件生成项目导出runtime_data软件打包 conti_rardar完整迁移过程common_msgcommoncanbusconti_radar编译 bazel迁移cmake要点及具体迁移工程示例 迁移要点指南 迁移主要的内容包…...

跨时钟域(CDC,clock domain crossing)信号处理

参考视频&#xff1a; 数字IC&#xff0c;FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是&#xff1a;建立时间和保持时间没有保持住。然后在下图的红框里面&#xff0c;产生亚稳态。因为电路反馈机制&#xff0c;最后大概率会恢复…...

Java高频面试之并发编程-16

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;volatile 实现原理是什么&#xff1f; volatile 关键字的实现原理 volatile 是 Java 中用于解决多线程环境下变量可见性…...

MyBatis 一对多关联映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis实现一对多关系时&#xff0c;可以通过XML映射文件来配置。下面我将详细介绍几种实现方式。 基本概念 一对多关系指的是一个实体对象包含多个子对象集合的情况&#xff0c;例如&#xff1a; 一个部门有多个员工一个订单有多个订单项一个博客有多个…...

Spring Boot异步任务失效的8大原因及解决方案

Spring Boot异步任务失效的8大原因及解决方案 摘要:在使用Spring Boot的@Async实现异步任务时,你是否遇到过异步不生效的问题?本文总结了8种常见的异步失效场景,并提供对应的解决方案,帮助你彻底解决异步任务失效的难题。 一、异步失效的常见场景 1. 未启用异步支持 ❌ …...

嵌入式Linux I2C驱动开发详解

文章目录 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 2. I2C的地址寻址机制 二、Linux I2C驱动框架的分层设计 1. I2C核心 2. I2C适配器 3. I2C设备驱动 三、I2C驱动开发测试 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 SDA&#xff08;数据线&#xff09; 和…...

基于 Spring Boot 瑞吉外卖系统开发(十二)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十二&#xff09; 菜品删除 单击“批量删除”和“删除”时&#xff0c;会携带需要删除的菜品的id以delete请求方式向“/dish”发送请求。 URLhttp://127.0.0.1:8080/dish调用方法DELETE参数ids DishController添加删除方法 …...