PromiseKit 4.5.x升级至6.x.x迁移问题咨询
升级PromiseKit 4.5.x到6.x.x:分块请求迁移合规方案
先把你截断的代码补全(应该是每个分块发起子请求后合并结果对吧?),原来4.5.x的代码大概是这样:
func fetchSettings(forAnimalsGuids animalsGuids: [String]) -> Promise<[JSON]> { if animalsGuids.isEmpty { return .value([]) } let packageSize = 100 let animalsPackages = animalsGuids.chunked(chunkSize: packageSize) return when(fulfilled: animalsPackages.map({ animalsPackage in fetchSinglePackageSettings(animalsPackage) // 假设这是返回Promise<[JSON]>的子请求 })).then { results in return Promise.value(results.flatMap { $0 }) } }
针对PromiseKit 6.x.x的升级,我整理了符合新版本规范的调整方案,同时贴合官方最佳实践:
修正后的合规代码
func fetchSettings(forAnimalsGuids animalsGuids: [String]) -> Promise<[JSON]> { guard !animalsGuids.isEmpty else { return .value([]) } let packageSize = 100 let animalsPackages = animalsGuids.chunked(chunkSize: packageSize) // 生成每个分块对应的请求Promise let packagePromises = animalsPackages.map(fetchSinglePackageSettings) // 等待所有请求完成并合并结果 return when(fulfilled: packagePromises).map { chunkResults in // 将二维结果数组扁平化为一维数组 chunkResults.flatMap { $0 } } }
关键调整与合规性说明
用
map替代then + Promise.value
PromiseKit 6.x强化了链式调用的简洁性,map操作符会自动把闭包返回值包装成Promise,完全替代了旧写法里then { return Promise.value(...) }的冗余逻辑,这是官方明确推荐的合规写法。严格的类型一致性检查
6.x对when(fulfilled:)的子Promise类型检查更严格,确保所有子请求的返回类型完全一致(这里都是Promise<[JSON]>)。如果你的子请求类型有差异,需要显式做类型转换,避免编译报错。核心行为兼容
when(fulfilled:)的核心逻辑和4.5.x保持一致:只要有一个子Promise失败,整个组合Promise会立刻失败;只有所有子请求都成功,才会进入后续的map闭包。如果业务需要允许部分请求失败,可以改用when(resolved:)并过滤成功结果。
额外注意点
- 确保你的
chunked自定义方法在当前Swift版本(升级PromiseKit通常伴随Swift升级到5+)下正常工作,检查是否有语法兼容性问题。 - 如果
fetchSinglePackageSettings的返回类型有变更,需要同步调整代码,避免类型不匹配的编译错误。
内容的提问来源于stack exchange,提问作者Kamil Harasimowicz
相关产品推荐
相关产品推荐

