ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Swift Promise kickoff详解:把throwing函数和Optional无缝接入异步链

Swift Promise kickoff详解:把throwing函数和Optional无缝接入异步链 Swift Promise kickoff详解把throwing函数和Optional无缝接入异步链【免费下载链接】PromiseA Promise library for Swift, based partially on Javascripts A spec项目地址: https://gitcode.com/gh_mirrors/promi/PromisePromise 是一个用 Swift 编写的轻量级 Promise 库部分借鉴了 JavaScript 的 A 规范。它的Promises.kickoff是整条异步链的“点火器”当你的链式起点是一个会throw的函数或者只是一个 Optional 值时kickoff能让它们无缝接入then异步链不用手写繁琐的do { } catch { }。为什么需要 kickoffthen闭包内部是“安全空间”——你可以自由try、throw库会自动把异常转换成链的失败rejection。但很多场景里链的第一步就遇到了麻烦起点是一个throws的同步函数比如读文件、解析配置起点是一个Optional为nil时你希望整条链优雅失败。没有kickoff时你只能先写一段do { } catch { }手动构造成功或失败的 Promise 才能开始链式调用代码立刻变得臃肿。kickoff 的两个重载版本kickoff是Promises命名空间下的静态方法有两个重载定义在 PromiseExtras.swift重载签名适用场景行为kickoffT(_ block: () throws - T)同步的 throwing 函数立即执行返回值包装成已成功的 Promise抛出错误则直接变成已失败的 PromisekickoffT(_ block: () throws - PromiseT)需要搭建一个异步链再返回内部实现是Promise(value: ()).then(block)即先进入then安全空间再把你返回的 Promise 交给链路继续两者都帮你省去了手动Promise(value:)/Promise(error:)的包装。场景一把 throwing 函数变成链的第一环假设loadConfig()是一个会抛出异常的同步函数Promises .kickoff { return try loadConfig() } .then { config in // 使用配置 } .catch { error in // 加载失败在这里统一处理 }throw被自动翻译成链的 rejection后续的then全部跳过直接落到catch。这正是测试用例 PromiseKickoffTests.swift 所验证的两个基础行为成功取值与失败拒绝。场景二Optional 无缝接入异步链README 中推荐的经典组合是kickoff 自定义unwrap()。先给 Optional 加一个会抛错的小扩展struct NilError: Error { } extension Optional { func unwrap() throws - Wrapped { guard let result self else { throw NilError() } return result } }然后在链的起点使用它Promises .kickoff { return try candidateValue.unwrap() } .then { value in // 这里一定是非 nil 的 } .catch { error in // candidateValue 为 nil 时会走到这里 }nil被翻译成一个错误整条链优雅地失败非nil时则直接进入链式处理Optional 被“转正”为非 Optional 值。场景三起点本身就是异步链如果第一步要做的不是取值而是搭建一段异步流程比如先延时、再请求用返回Promise的重载let promise Promises .kickoff { return Promises.delay(0.5) .then { return 2 } }kickoff内部等价于Promise(value: ()).then(block)——先创建一个立即成功的“引子” Promise再把你的闭包挂到then上执行因此闭包里可以throw也可以返回任意 Promise 继续衔接。使用 kickoff 的 3 个注意事项务必接上catch。起点闭包一旦抛错Promise 立即进入 rejected 状态后续所有then都不会执行。同步重载是立即执行的闭包里的耗时逻辑不会自动切到后台重活请放到后续的then块或用Promise(work:)初始化器里做。与 Optional 配合时NilError只是约定俗成的哨兵错误你也可以抛带信息的自定义错误以便在catch中区分“数据缺失”和“数据非法”。写在最后kickoff的精髓只有一句话让“会抛错的起点”和“可能为空的起点”以和异步起点完全一致的姿态融入 Promise 链。除了kickoffPromises命名空间还提供all聚合、race竞速、retry重试、zip配对等静态方法都集中在 PromiseExtras.swift 中值得逐个了解。【免费下载链接】PromiseA Promise library for Swift, based partially on Javascripts A spec项目地址: https://gitcode.com/gh_mirrors/promi/Promise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表