无法返回末尾带有捕获块的承诺链

  • 本文关键字:承诺 返回 swift promisekit
  • 更新时间 :
  • 英文 :


这曾经有效,但在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的答案以获得灵感。

最新更新