ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

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

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),仅供参考
返回列表