PromiseKit 6.0将捕获的错误传递给调用方

Kam*_*icz 3 promise ios swift promisekit

根据迁移指南PromiseKit 6.x更改了有关catch块的策略。在PMK 4中catch返回了附加的承诺。现在catch是一个终结者。我了解为什么要进行这些更改,但是...

在我的代码库(与PK4连接)中,我从catch返回保证中获得了一些好处。

func loginAndSync(withServerAddress address: String, port: String) -> Promise<()> {
    synchronizationService.stopAllRunningSingleSynchronizations()

    return
        authorizationService.save(serverAddress: address, andPort: port)
            .then {
                self.synchronizationService.startSingleFullSynchronization()
            }
            .then {
                self.authorizationService.markAsServerSynced()
            }
            .catch { error in
                log.error(error)
                _ = self.authorizationService.markAsServerUnsynced()
            }
}
Run Code Online (Sandbox Code Playgroud)

在此函数中,我提出了一些在某些情况下可能会失败的逻辑。万一发生错误,catch块应该做出一些逻辑处理,但是我还要loginAndSync将此承诺(履行或拒绝)的结果发送给函数的调用者。上面的函数可以由ViewController调用,例如,在ViewController中,我想显示错误或成功对话框。

这就是catch一个Promise链需要两个ES 的原因。一为authorizationServiceUI

PromiseKit6中是否有解决方法来实现这一目标?

编辑

我发现了两个解决方案(解决方法)。我创建了两个答案以将它们分开。未来的读者可以决定哪个更好或提供新的。

Kam*_*icz 5

我发现(IMO)更好的解决方法。PromiseKit6引入了非常方便的方法tap。我尝试用它来解决我的问题。

func loginAndSync(withServerAddress address: String, port: String) -> Promise<()> {
    synchronizationService.stopAllRunningSingleSynchronizations()

    return authorizationService.save(serverAddress: address, andPort: port)
        .then {
            self.synchronizationService.startSingleFullSynchronization()
        }
        .then {
            self.authorizationService.markAsServerSynced()
        }
        .tap { result in
            switch result {
            case .rejected(let error):
                log.error(error)
                _ = self.authorizationService.markAsServerUnsynced()
            default: break
            }
        }
        .done {
            self.coordinatorDelegate?.handleLoginServerSuccess()
        }
}
Run Code Online (Sandbox Code Playgroud)

对于文档:

tap 为您提供链的当前结果,如果链成功或失败,则称为

因此,我可以为终止链的Promise当前状态提供自定义错误处理。承诺可以发送给发件人,在此我可以做其他事情tap或通过终止链catch

  • 您还可以使用“恢复”而不是“点击”。这样您就不必每次都打开结果,因为您本身就会收到错误。因此,您可以通过执行一些逻辑来响应错误,然后返回错误(对于后续的恢复块或其他人的catch块)。通过恢复,多层“响应错误”的任务更加强大,因为您可以执行更多操作,例如返回 Promise 子分支的根 (2认同)