PromiseKit 6.0 迁移
Posted
技术标签:
【中文标题】PromiseKit 6.0 迁移【英文标题】:PromiseKit 6.0 migration 【发布时间】:2018-04-13 07:50:03 【问题描述】:我决定在我的项目中将 PromiseKit pod 从 4.5.x 升级到 6.x.x。在迁移过程中,我遇到了一个问题,我不能 100% 确定我以正确的方式解决了它。
看看我的 PromiseKit 4.5 示例代码:
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 -> Promise<[JSON]> in
let predicates: [GatewayRequestFactoryHelper.Predicate] = animalsPackage.map( .atomic(.equal("Animal.ObjectGuid", .string($0))) )
let predicate: GatewayRequestFactoryHelper.Predicate? = !predicates.isEmpty ? .or(predicates) : nil
return gatewayConnector.fetchObjects(type: AnimalMilkSetting.self, predicate: predicate)
))
.then result in
Promise(value: Array(result.joined()))
在Promise(value: Array(result.joined()))
的一行中出现错误:
参数标签 '(value:)' 不匹配任何可用的重载
根据 PromiseKit 迁移指南 return Promise(value: foo)
已被替换为:return .value(foo)
,所以我重构了我的代码:
func fetchAnimal(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 -> Promise<[JSON]> in
let predicates: [GatewayRequestFactoryHelper.Predicate] = animalsPackage.map( .atomic(.equal("Animal.ObjectGuid", .string($0))) )
let predicate: GatewayRequestFactoryHelper.Predicate? = !predicates.isEmpty ? .or(predicates) : nil
return gatewayConnector.fetchObjects(type: AnimalMilkSetting.self, predicate: predicate)
))
.then result in
.value(Array(result.joined()))
// Promise(value: Array(result.joined()))
它没有帮助。编译显示错误信息:
无法将“Promise<_.t>”类型的返回表达式转换为“Promise”类型的返回表达式
我做了一些调整,终于找到了我的编译器接受的解决方案:
func fetchAnimal(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 -> Promise<[JSON]> in
let predicates: [GatewayRequestFactoryHelper.Predicate] = animalsPackage.map( .atomic(.equal("Animal.ObjectGuid", .string($0))) )
let predicate: GatewayRequestFactoryHelper.Predicate? = !predicates.isEmpty ? .or(predicates) : nil
return gatewayConnector.fetchObjects(type: AnimalMilkSetting.self, predicate: predicate)
))
.then result in
Promise $0.fulfill(Array(result.joined()))
你能给我一个答案吗?我是否以适当的方式迁移它?方式.value(Array(result.joined()))
不行?
【问题讨论】:
【参考方案1】:我想我自己找到了答案。我使用了 PromiseKit 6 中引入的map
。来自文档:
map
被提供了之前的承诺值,并要求你返回一个非承诺,即。一个值。
所以:
func fetchAnimal(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 -> Promise<[JSON]> in
let predicates: [GatewayRequestFactoryHelper.Predicate] = animalsPackage.map( .atomic(.equal("Animal.ObjectGuid", .string($0))) )
let predicate: GatewayRequestFactoryHelper.Predicate? = !predicates.isEmpty ? .or(predicates) : nil
return gatewayConnector.fetchObjects(type: AnimalMilkSetting.self, predicate: predicate)
))
.map
Array($0.joined())
我认为这种解决方案比将结果包装在另一个 Promise 中要好。简单而迅速。
【讨论】:
兄弟,你能回答一下关于 PromiseKit 6 的问题吗?***.com/questions/62780222/…以上是关于PromiseKit 6.0 迁移的主要内容,如果未能解决你的问题,请参考以下文章
路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解
Laravel 6.0 迁移 - SQLSTATE[HY000] [2002] 没有这样的文件或目录
VMware vSphere 4.0平台虚机迁移至VMware vSphere 6.0平台方法
将 Spring Web App 从 tomcat 5.5 迁移到 tomcat 6.0 的问题