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

时间:2018-12-13 21:41:10

标签: 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块并继续将链返回给调用函数?

2 个答案:

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