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 的问题

发布时迁移到 .NET 6.0 错误:资产文件没有“net5.0”的目标

ASP.NET 6.0 Core 迁移 ASP.NET Core 7.0