PromiseKit 首先围绕代码,而不是函数调用

Posted

技术标签:

【中文标题】PromiseKit 首先围绕代码,而不是函数调用【英文标题】:PromiseKit firstly around code, not function call 【发布时间】:2018-09-20 07:09:53 【问题描述】:

我不想编写一个单独的函数来在我的第一次调用中返回一个 Promise。我只想写这个:

firstly

    return Promise<Bool>
     inSeal in
        var isOrderHistory = false
        let importTester = CSVImporter<String>(url: url)
        importTester?.startImportingRecords(structure:
             (inFieldNames) in
                if inFieldNames[2] == "Payment Instrument Type"
                
                    isOrderHistory = true
                
            , recordMapper:  (inRecords) -> String in
                return ""   //  Don't care
            ).onFinish
             (inItems) in
                inSeal.resolve(isOrderHistory)
            
    

.then
 inIsOrderHistory in
    if inIsOrderHistory -> Void
    
    
    else
    
...

但是我搞错了。 ImportMainWindowController.swift:51:5: Ambiguous reference to member 'firstly(execute:)'

示例代码或文档似乎都没有涵盖这个(我认为是)基本用例。在上面的代码中,CSVImporter 在后台队列上运行并异步调用方法(尽管按顺序)。

我无法弄清楚 Promisefirstly 的完整类型规范应该是什么。

【问题讨论】:

【参考方案1】:

根据我的理解,由于您在承诺链中使用then,它也意味着返回一个承诺,因此您会收到此错误。如果你不打算从下一步返回promise,你可以在first之后直接使用done

如果你想从then返回Promise,请使用下面的链

firstly 
     Promise<Bool>  seal in
        print("hello")
        seal.fulfill(true)
     
.then  (response) in
    Promise<Bool>  seal in
            print(response)
            seal.fulfill(true)
    
.done  _ in
    print("done")
.catch  (error) in
        print(error)

如果你不想从then返回Promise,你可以使用如下链。

firstly 
            Promise<Bool>  seal in
                print("hello")
                seal.fulfill(true)
            
        .done  _ in
                print("done")
        .catch  (error) in
                print(error)
        

希望对你有所帮助。

更新:

如果您不想返回任何东西并且then 要求返回Promise,您可以返回Promise&lt;Void&gt;,如下所示。

firstly 
    Promise<Bool>  seal in
        print("hello")
        seal.fulfill(true)
    
.then  (response) -> Promise<Void> in
            print(response)
            return Promise()
.done  _ in
        print("done")
.catch  (error) in
        print(error)

【讨论】:

是的,这似乎是问题所在。但现在我发现我真的想要一个什么都不返回的.then,因为我想要在.done 部分做其他事情的语义清晰。 .then 在对象上设置一个属性。显然它可以返回该结果,但似乎我应该能够拥有不返回任何内容的.then。也许我只是挑剔? 你可以使用 Promise。我已经更新了答案。我希望这会有所帮助

以上是关于PromiseKit 首先围绕代码,而不是函数调用的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit:无法在 then 处理程序之间调用自定义代码

为啥无法编译递归 PromiseKit 函数?

从 PromiseKit 包装迁移

如何在 PromiseKit 6 中使用循环?

PromiseKit 4 - 包装委托

PromiseKit 无法在链中命中