swift 无法返回末端带有catch块的promise链

sc4hvdpw  于 2023-03-22  发布在  Swift
关注(0)|答案(2)|浏览(133)

这曾经工作,但与版本6的PromiseKit这...

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”的返回表达式转换为返回类型“Promise”
如何添加catch块并继续向调用函数返回链?

e4eetjau

e4eetjau1#

你只需要像下面这样删除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类是一个 Package 器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)
}
rqdpfwrv

rqdpfwrv2#

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以获得灵感。

相关问题