Swift Promise三态模型深度解析:一文读懂pending、fulfilled与rejected

发布时间:2026/8/26 15:16:32

Swift Promise三态模型深度解析:一文读懂pending、fulfilled与rejected
Swift Promise三态模型深度解析一文读懂pending、fulfilled与rejected【免费下载链接】PromiseA Promise library for Swift, based partially on Javascripts A spec项目地址: https://gitcode.com/gh_mirrors/promi/PromisePromise 是一个基于 JavaScript A 规范设计的Swift 异步库其核心是Swift Promise 三态模型pending等待中、fulfilled已兑现与 rejected已拒绝。本文带你一文读懂这三个状态的来源、流转规则与实际用法帮助新手快速建立对 Swift Promise 的正确心智模型。⏳ 一句话理解Promise 就是一个未来才会有结果的任务而这个结果只有三种可能——还没出来pending、成功了fulfilled、失败了rejected。为什么 Swift Promise 需要三态模型在README.md中官方把 Promise 定义为表示一个未来某个时刻会存在的值或者会以一个错误失败的类型。它和Optional很像——Optional描述值可能在这里而 Promise 描述值将来会在这里。要完整地描述一个未来的结果恰好需要三种状态状态含义类比pending任务还在进行中快递在路上 fulfilled任务成功完成携带结果值已签收 ✅rejected任务失败携带一个错误包裹丢了 ❌系统一旦知道成功长什么样、失败长什么样组合异步操作就变得简单链式调用、并行执行、重试、超时……都建立在三态之上。三态的定义位于核心源文件Promise/Promise.swift中的State枚举enum StateValue: CustomStringConvertible { /// 任务还没完成将来会转为 fulfilled 或 rejected case pending(callbacks: [CallbackValue]) /// 任务成功携带结果值 case fulfilled(value: Value) /// 任务失败携带错误 case rejected(error: Error) }三大状态逐个拆解1️⃣ pending还没出结果的进行中状态每个用默认初始化器创建的 Promise 都从 pending 开始let promise PromiseData() // 创建时即为 pendingpending 状态并非空等它内部保存着一个回调队列callbacks。你在任务完成前挂上去的所有then处理块都会先被登记在这个队列里等任务一结束再统一触发。这就是 Promise 允许先注册、后执行的关键。对于委托delegate风格的回调 API典型做法就是先Promise()建一个 pending 的 Promise等回调到达时再手动改变它的状态。2️⃣ fulfilled成功完成携带结果值调用fulfill(_:)可以把 pending 的 Promise 转为 fulfilled并附上结果值promise.fulfill(data) // 转为 fulfilled携带 data也支持生来就成功let p Promise(value: 42) // 创建即 fulfilledfulfilled 后你可以通过公开的value属性拿到结果用isFulfilled判断状态。3️⃣ rejected失败完成携带错误对称地reject(_:)把 Promise 转为 rejected 并附上一个Errorpromise.reject(error) // 转为 rejected携带 error let p Promise(error: someError) // 创建即 rejectedrejected 后可通过error属性取回错误用isRejected判断状态。三态如何流转记住两条铁律 整个状态机只有两条转换规则非常克制pending → fulfilled 或 rejected二选一只能由fulfill/reject触发一次fulfilled / rejected 是终态一旦确定永不改变。这一点在Promise/Promise.swift的updateState方法中被严格执行——只有当前处于 pending 时状态更新才会生效guard case .pending(let callbacks) self.state else { return }它带来两个重要特性先到先得多次调用fulfill/reject只有第一次生效后续调用被直接忽略。你不必担心状态被覆盖的竞态问题线程安全所有状态读写都经过一个内部串行锁队列lockQueue从多线程并发触发也不会出错。换句话说一个 Promise 的一生最多只走一条路pending → fulfilled或pending → rejected。三态判断属性随时检查 Promise 现在在哪一站Swift Promise 为三个状态分别提供了公开的布尔属性方便你在业务代码中做检查isPending还在进行中isFulfilled已成功isRejected已失败配套的value与error属性则分别只在对应终态下返回值其他情况返回nil。这些判断不是摆设。以Promise/PromiseExtras.swift中的Promises.all为例——它要等所有 Promise 都完成后才兑现判断条件正是!promises.contains(where: { $0.isRejected || $0.isPending })只要还有任何一个处于 pending或者有一个 rejected整体就不会成功。可见三态是整个组合 API 的地基。三态模型解锁的实用能力 理解三态之后库里的常用方法就都说人话了then为 fulfilled 注册处理块若任务仍处于 pending处理块会被暂存等待catch为 rejected 注册错误处理链条中任何一环 rejected后续then全部跳过只走失败分支always不管最终是 fulfilled 还是 rejected 都执行——因为此刻 Promise 一定已离开 pending所以它既不需要值也不需要错误all/race/retry/zip这些组合工具本质上都是对多个 Promise 三态的编排——all等全部 fulfilled、race取第一个完成的、retry在 rejected 后重新来一遍。一个最小示例串起三态let promise PromiseInt(work: { fulfill, reject in // 闭包执行前promise 处于 pending fulfill(42) }).then { value in print(value) // fulfilled 分支42 }.catch { error in print(error) // rejected 分支 }创建到fulfill(42)之间是 pendingfulfill之后是 fulfilledthen分支随之触发。如果工作闭包里抛出异常或显式调用reject则转为 rejected只走catch分支。新手常见问题 FAQQ1Promise 能从 rejected 恢复回 pending 重试吗不能。状态流转是单向的终态不可逆。想重试应该用Promises.retry生成一个新的Promise而不是原地改状态。Q2为什么isFulfilled的实现是value ! nil因为 fulfilled 的定义就是携带了一个值用值是否存在来等价判断简洁且无歧义。Q3pending 期间注册的回调会丢失吗不会。这正是 pending 携带callbacks队列的意义——回调会按注册顺序在状态确定后依次触发。总结三句话记住 Swift Promise 三态模型每个 Promise 都处于且仅处于pending / fulfilled / rejected三者之一状态只能从 pending 单向走向某个终态先到先得、永不再变fulfill附带值、reject附带错误then/catch/always则分别对应成功做什么、失败做什么、无论成败做什么。掌握这三态你就掌握了Promise/Promise.swift与Promise/PromiseExtras.swift中所有 API 的运行逻辑Swift 异步编程的下一站——链式调用与组合编排——也就顺理成章了。【免费下载链接】PromiseA Promise library for Swift, based partially on Javascripts A spec项目地址: https://gitcode.com/gh_mirrors/promi/Promise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Blender Launcher V2设置全解析:常规、外观、代理与启动参数五大类选项指南

Blender Launcher V2设置全解析:常规、外观、代理与启动参数五大类选项指南

2026/8/26 15:06:32

Blender Launcher V2设置全解析:常规、外观、代理与启动参数五大类选项指南 【免费下载链接】Blender-Launcher-V2 Standalone client for managing official builds of Blender 3D and its popular forks 项目地址: https://gitcode.com/gh_mirrors/bl/Blender-L…

【C语言】数据类型和变量【下】

【C语言】数据类型和变量【下】

2026/8/26 15:06:32

/ 除法规则两个整数相除 → 整数除法,只取商,舍弃小数部分printf("%d\n", 6 / 3); //2 printf("%d\n", 6 / 4); //1只要有一边是小数(浮点数),就做浮点除法,得到小数结果printf(&quo…

LHDC V5 手机到耳机音乐传输链路详解

LHDC V5 手机到耳机音乐传输链路详解

2026/8/26 15:06:32

以手机本地播放 test1.mp3 通过 LHDC V5 编码传输到蓝牙耳机并播放为例,详细说明从文件到声音的完整技术链路。 LHDC V5 三部曲导航: LHDC V5 编解码流程与原理详解LHDC V5 手机到耳机音乐传输链路详解LHDC V5 算法深度解析 一、整体链路概览 ┌────…

如何安装dsh deepseek harness

如何安装dsh deepseek harness

2026/8/26 18:36:41

目录 安装 nvm 安装dsh 使用npx deepseek-ai/dsh weba安装 使用git clone https://github.com/deepseek-ai/deepseek-harness.git 下载到本地安装 准备工作: 1:首先去存盘里找到文件夹 2:在输入框中打上cmd ​编辑 指令的输入 1&am…

postiz-mcp MCP 服务说明文档

postiz-mcp MCP 服务说明文档

2026/8/26 18:36:41

1. 服务概述一句话简介:Postiz官方MCP客户端,提供完整的Postiz公共API覆盖(集成、帖子、上传、分析、视频),支持环境变量控制写入权限、确认删除和内置速率限制保护服务名称:postiz-mcp版本号:1…

水域救援割绳刀怎么选?看懂性能参数,选对靠谱生产厂家

水域救援割绳刀怎么选?看懂性能参数,选对靠谱生产厂家

2026/8/26 18:36:41

结论先行:水域救援割绳刀是体积最小、却直接关系生死的应急装备,国内选型已有清晰的参数共识:刀刃硬度不低于48HRC(按GB/T 230.1洛氏硬度方法检测)、平头钝头防刺伤刀型加齿形割绳刃、湿手单手操作的防滑手柄、刀鞘牢固…

谁在偷偷看你的位置?安卓手机应用行为记录一键查询

谁在偷偷看你的位置?安卓手机应用行为记录一键查询

2026/8/26 18:36:41

位置信息是核心隐私数据。Android 15新增应用行为记录功能,让用户清晰查看所有应用访问位置信息的记录,精准识别频繁访问的应用。本文解析原理、查看步骤、优化技巧及故障排查。一、核心逻辑与风险应用通过调用系统位置API获取位置信息。Android 15收紧权…

Apache Paimon 源码导读(二):Action 如何构建并提交 Flink 作业

Apache Paimon 源码导读(二):Action 如何构建并提交 Flink 作业

2026/8/26 18:36:41

目录一、Action 对象已经有了,Flink 作业还没有运行二、run() 到底定义在哪个类里?三、创建 Action 时,执行环境已经准备好了为什么开启 Object Reuse?四、run() 实际只做三件事1. 没有配置 Checkpoint 时,默认开启三分…

2026 年 AI Agent 框架横评:10 大框架优缺点对比 + 选型指南

2026 年 AI Agent 框架横评:10 大框架优缺点对比 + 选型指南

2026/8/26 18:26:40

本文由 GO FUNNY 出品。专注 AI Agent 协作方法论与开源工具深度解读。你想搭一个 AI agent,打开 GitHub 搜「agent framework」,按 star 排序,点进第一名,照着 quickstart 敲完,跑通了一个 demo——觉得这事稳了。然后…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

2026/8/26 0:05:45

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

2026/8/26 0:05:45

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

2026/8/26 0:05:45

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…