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 的原因。一为authorizationService一UI。
PromiseKit6中是否有解决方法来实现这一目标?
我发现了两个解决方案(解决方法)。我创建了两个答案以将它们分开。未来的读者可以决定哪个更好或提供新的。
我发现(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。
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |