无法返回末端带有catch块的承诺链

Ian*_*ton 5 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
    }
Run Code Online (Sandbox Code Playgroud)

...给...

无法将类型“ PMKFinalizer”的返回表达式转换为返回类型“ Promise”

如何添加catch块并继续将链返回给调用函数?

Kam*_*ran 5

您只需catch按如下所示删除块即可,

func checkIn(request: CheckinRequest) -> Promise<CheckinResponse> {
     let p = checkinService.checkIn(request: request)
          .then { r -> Promise<CheckinResponse> in
              return .value(r)
        }
      return p
}
Run Code Online (Sandbox Code Playgroud)

此处使用捕获块是无关紧要的,因为它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)
            })
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以简单地做,

let request = CheckinRequest()
checkinService.checkIn(request: request).result().done { response in
    // Check in response
}
Run Code Online (Sandbox Code Playgroud)

您仍然可以对多个 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)
}
Run Code Online (Sandbox Code Playgroud)