PromiseKit 6.0 迁移
PromiseKit 6.0 migration
我决定在我的项目中将 PromiseKit pod form 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([=10=]))) })
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()))
一致,我得到了一个错误:
Argument labels '(value:)' do not match any available overloads
根据 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([=11=]))) })
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()))
}
}
没用。编译显示错误信息:
Cannot convert return expression of type 'Promise<_.T>' to return type 'Promise<[JSON]>'
我做了一些调整,最终找到了一个被我的编译器接受的解决方案:
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([=12=]))) })
let predicate: GatewayRequestFactoryHelper.Predicate? = !predicates.isEmpty ? .or(predicates) : nil
return gatewayConnector.fetchObjects(type: AnimalMilkSetting.self, predicate: predicate)
}))
.then { result in
Promise { [=12=].fulfill(Array(result.joined())) }
}
}
你能给我一个答案吗?我是否以正确的方式迁移了它?方式.value(Array(result.joined()))
行不通?
我想我自己找到了答案。我使用了 PromiseKit 6 中引入的 map
。来自文档:
map
is fed the previous promise value and requires you return a non-promise, ie. a value.
所以:
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([=10=]))) })
let predicate: GatewayRequestFactoryHelper.Predicate? = !predicates.isEmpty ? .or(predicates) : nil
return gatewayConnector.fetchObjects(type: AnimalMilkSetting.self, predicate: predicate)
}))
.map {
Array([=10=].joined())
}
}
我认为这个解决方案比将结果包装在另一个 Promise 中要好。简单快捷。
我决定在我的项目中将 PromiseKit pod form 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([=10=]))) })
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()))
一致,我得到了一个错误:
Argument labels '(value:)' do not match any available overloads
根据 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([=11=]))) })
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()))
}
}
没用。编译显示错误信息:
Cannot convert return expression of type 'Promise<_.T>' to return type 'Promise<[JSON]>'
我做了一些调整,最终找到了一个被我的编译器接受的解决方案:
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([=12=]))) })
let predicate: GatewayRequestFactoryHelper.Predicate? = !predicates.isEmpty ? .or(predicates) : nil
return gatewayConnector.fetchObjects(type: AnimalMilkSetting.self, predicate: predicate)
}))
.then { result in
Promise { [=12=].fulfill(Array(result.joined())) }
}
}
你能给我一个答案吗?我是否以正确的方式迁移了它?方式.value(Array(result.joined()))
行不通?
我想我自己找到了答案。我使用了 PromiseKit 6 中引入的 map
。来自文档:
map
is fed the previous promise value and requires you return a non-promise, ie. a value.
所以:
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([=10=]))) })
let predicate: GatewayRequestFactoryHelper.Predicate? = !predicates.isEmpty ? .or(predicates) : nil
return gatewayConnector.fetchObjects(type: AnimalMilkSetting.self, predicate: predicate)
}))
.map {
Array([=10=].joined())
}
}
我认为这个解决方案比将结果包装在另一个 Promise 中要好。简单快捷。