这曾经有效,但在PromiseKit的第6版中。。。
func checkIn(request: CheckinRequest) -> Promise<CheckinResponse> {
let p = checkinService.checkIn(request: request)
.then { r -> Promise<CheckinResponse> in
return .value(r)
}.catch { e in
}
return p
}
给予。。。
无法将"PMKFinalizer"类型的返回表达式转换为返回类型"承诺">
如何添加catch块并继续将链返回到调用函数?
您只需要删除catch
块,如下所示,
func checkIn(request: CheckinRequest) -> Promise<CheckinResponse> {
let p = checkinService.checkIn(request: request)
.then { r -> Promise<CheckinResponse> in
return .value(r)
}
return p
}
在这里使用catching块是无关紧要的,因为error
应该由被调用者处理。
Guarantee
类是一个包装器class
,用于进行可丢弃的result
调用。因此,我们可以创建一个处理promise
的方法,这样我们就可以使用.done
回调来使用result
,如下所示,
extension Promise {
func result() -> Guarantee<T> {
return Guarantee<T>(resolver: { [weak self] (body) in
self?.done({ (result) in
body(result)
}).catch({ (error) in
print(error)
})
})
}
}
现在你可以简单地做,
let request = CheckinRequest()
checkinService.checkIn(request: request).result().done { response in
// Check in response
}
你仍然可以使用链接的多个承诺如下,
checkinService.checkIn(request: request).result().then { (result) -> Promise<Bool> in
// Use reuslt
return .value(true)
}.done { bool in
print(bool)
}.catch { (e) in
print(e)
}
这里描述了您需要了解的一切,只需滚动到.catch{ /*…*/ }.finally
部分即可。
如果你想保持相同的功能,你可以使用这个解决方案:
func checkIn(request: CheckinRequest) -> Promise<CheckinResponse> {
let p = checkinService.checkIn(request: request).then { r -> Promise<CheckinResponse> in
return .value(r)
}
p.catch { e in
}
return p
}
但是,不建议使用此模式。CCD_ 10是链终止子。因此,您应该重构代码。查看Kamran的答案以获得灵感。