使用PromiseKit

时间:2015-12-28 22:11:06

标签: swift promisekit

在处理执行promise时可能抛出的错误时使用recover时遇到一个奇怪的错误。

如果在recover块中有多个语句,则使用.then链接.recover会导致编译。

在恢复块中使用单个语句并单独进行恢复(promise.recover {},然后无效)

附加单个语句恢复(有效)和多个语句恢复的屏幕截图(这会引发一个编译错误消息:Ambigous use of recover(on:__:)

任何有关如何调试此操作的帮助都将受到赞赏。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

recover可以返回Promise。如果你的恢复块中只有一个语句,那么编译器不会抱怨,因为只有一行可能返回任何内容。当您添加第二个语句时,编译器无法推断哪一行返回了某些内容。明确表示您正在返回Void是一种可能的解决方案,假设您不打算实际返回任何内容。

func getNext() {
    taskGroup.getNext().then { data in
        self.initViewWithTask(data as! Task)
    }.recover { error -> Void in
        print("in recover")
        print("in recover 2")
    }
}

说明:

这四个示例功能相同,最后会打印One : Two : Three。第一个示例中的闭包是明确的,它将接收什么参数+类型以及返回什么类型。每个后续示例都会对发生的事情越来越不清楚,因此编译器必须推断/推断正在发生的事情。编译器可以弄清楚发生了什么,因为这些例子很简单。

firstly {
    return Promise("One")
}.then { (result1: String) -> Promise<String> in
    return Promise("\(result1) : Two")
}.then { (result2: String) -> Promise<String> in
    return Promise("\(result2) : Three")
}.then { (result3: String) -> Void in
    print(result3)
    return
}

firstly {
    Promise("One")
}.then { (result1: String) -> Promise<String> in
    Promise("\(result1) : Two")
}.then { (result2: String) -> Promise<String> in
    Promise("\(result2) : Three")
}.then { (result3: String) -> Void in
    print(result3)
}

firstly {
    Promise("One")
}.then { result1 -> Promise<String> in
    Promise("\(result1) : Two")
}.then { result2 -> Promise<String> in
    Promise("\(result2) : Three")
}.then { result3 -> Void in
    print(result3)
}

firstly {
    Promise("One")
}.then { result1 in
    Promise("\(result1) : Two")
}.then { result2 in
    Promise("\(result2) : Three")
}.then { result3 in
    print(result3)
}

现在在第一个闭包中添加第二行。编译器会感到困惑,因为它不知道要返回什么。它可以是999One。即使像你一样添加一个简单的print语句也会混淆编译器,它会抱怨ambiguous something。因此编译器需要变得更聪明(在简单的打印语句的情况下它当然可以)或者您需要更明确地了解正在发生的事情。

// ambiguous
firstly {
    Promise(999)
    Promise("One")
}.then { result1 in
    Promise("\(result1) : Two")
}.then { result2 in
    Promise("\(result2) : Three")
}.then { result3 in
    print(result3)
}

// clear
firstly {
    Promise(999)
    return Promise("One")
}.then { (result1: String) in
    Promise("\(result1) : Two")
}.then { result2 in
    Promise("\(result2) : Three")
}.then { result3 in
    print(result3)
}

作为旁注......这与PromiseKit没有任何关系。这些示例可以在没有PromiseKit的情况下编写。它只是理解Swift编译器现在如何解释闭包。

答案 1 :(得分:0)

对于PromiseKit 6.11.0(Swift 5.1 / Xcode 11.1),如果您不想从闭包中返回done,则应使用then而不是Thenable。在这种情况下,您将不会得到“歧义使用恢复”

taskGroup.getNextTask().done { data in
    self.initViewWithTask(data as! Task)
}.recover { error in
    NSLog("in recover")
}