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),仅供参考

相关新闻

最新新闻

live555 生成 Visual Studio 工程

live555 生成 Visual Studio 工程

1,安装Visual Studio 工程 如 Visual Studio 2022,建议安装包含「使用 C 的桌面开发」工作负载,以便后续编译 Live555 相关工程。下载地址:Visual Studio 官网,选择 Community 版本即可免费使用。安装时勾选「使用 C …

2026/8/26 16:01:29
告别 Demo 陷阱!2026 企业 BI 与决策智能选型指南

告别 Demo 陷阱!2026 企业 BI 与决策智能选型指南

2026年,BI市场正在经历一场从「看数」到「问数」、再到「决策」的集体跃迁。几组数据勾勒出这场转变的烈度:IDC数据显示,2025年中国BI软件市场规模达13.2亿美元,连续6年保持25%以上的同比增速,贡献了亚太地区65%以上的…

2026/8/26 16:01:29
模块4 微信小程序开发用户界面-项目2 界面功能实现-任务2 从OneNet平台获取数据

模块4 微信小程序开发用户界面-项目2 界面功能实现-任务2 从OneNet平台获取数据

基于STM32的物联网环境监测与远程控制系统实训套件-淘宝网 任务2 从OneNet平台获取数据 一、任务描述 本任务基于微信小程序,结合任务 1 生成的鉴权 Token,调用 OneNET 物联网平台 标准 HTTP 接口,实现小程序向云端请求设备上报的温度、湿…

2026/8/26 16:01:29
元初混沌体系 第三卷 卫星互联网全域周天拓扑体系:第二十五篇 低轨星间激光/微波双链路拓扑架构

元初混沌体系 第三卷 卫星互联网全域周天拓扑体系:第二十五篇 低轨星间激光/微波双链路拓扑架构

第二十五篇 低轨星间激光/微波双链路拓扑架构承启前置 架构立论前文第十九至二十四篇已完整完成低轨周天接入层空间几何拓扑全维度定型:周天网格奠定球面曲率自适应基底,单轨八卦环形排布锁定微观对称稳态,多轨交错相位实现全域正交错峰&…

2026/8/26 16:01:29
企业微信管理难题何解?

企业微信管理难题何解?

当“离职带走客户”成为常态,当“删聊天记录”变成潜规则,你的企业微信真的安全吗?📌 前言企业微信已从“内部IM”进化为“客户经营主阵地”,但随之而来的数据失控、客户流失、合规风险,正成为管理者的三座…

2026/8/26 16:01:29
微信投票平台全链路防刷技术详解:七层防御架构原理与落地应用

微信投票平台全链路防刷技术详解:七层防御架构原理与落地应用

防刷能力是专业投票平台的核心基础能力之一,才谷网投票作为全场景通用型专业投票平台,搭载七层全链路交叉防刷体系,基于弹性分布式架构落地,已在政企、金融、校园、商业等全行业多场景应用验证。平台具备 ICP 与公安网安双备案&am…

2026/8/26 15:56:28