这曾经可以使用,但是可以与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块并继续将链返回给调用函数?
答案 0 :(得分:2)
您只需要删除catch
块,如下所示,
func checkIn(request: CheckinRequest) -> Promise<CheckinResponse> {
let p = checkinService.checkIn(request: request)
.then { r -> Promise<CheckinResponse> in
return .value(r)
}
return p
}
在这里使用捕获块是无关紧要的,因为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
}
您仍然可以将链式用于多个promise,如下所示,
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)
}
答案 1 :(得分:1)
here描述了您需要了解的所有内容,只需滚动至.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
}
但是,不建议使用此模式。 catch
是链终止符。因此,您应该重构代码。检查Kamran's answer以获得灵感。