RxMoya中如何正确过滤SuccessfulStatusCodes

How properly filterSuccessfulStatusCodes in RxMoya

我正在使用 RxMoya,我想知道 fiterSuccesfulStatusCodes 的用法,我将尝试描述我的问题是什么......所以当你使用这样的网络调用时

func getAllApps(gwId: Int) -> Observable<Response> {
    return provider.request(RestAPI.GetAllApps(gwId: gwId)).filterSuccessfulStatusCodes()
}

当您收到状态代码高于 299 的响应时,什么也不会发生,我的问题是我想向用户显示错误消息,但是当您检查 filterSuccessfulStatusCodes 的作用时:

public func filterSuccessfulStatusCodes() -> Observable<E> {
    return flatMap { response -> Observable<E> in
        return Observable.just(try response.filterSuccessfulStatusCodes())
    }
}

现在我们离我遇到的问题越来越近了。因此 filterSuccessfulStatusCodes 的实现使用 public Moya.Resposne 的实例函数和此实现:

public func filterSuccessfulStatusCodes() throws -> Response {
    return try filterStatusCodes(200...299)
}

如你所见,这个东西会抛出异常...但是上面的函数,它不会重新抛出,它 returns Observable of generic type E.

我的第一个问题,当函数没有 throw/rethrow 时,为什么你可以使用 return Observable.just(尝试 response.filterSuccessfulStatusCodes())。你可以用try withou do/chatch?(我知道用try!/try?你可以但是用try,我只能想象rethrow的情况)。

第二个问题,是否有一种在可观察级别上对错误状态代码做出反应的方法。

谢谢

  • try response.filterSuccessfulStatusCodes() 不在 filterSuccessfulStatusCodes() 范围内使用,但在 flatMap.

    范围内使用

    如果我们看一下 ObservableflatMap 的定义,我们会得到

    func flatMap<O: ObservableConvertibleType>(_ selector: @escaping (E) throws -> O)
      -> Observable<O.E>
    

    selector这里抛出,所以我们可以用try.

  • 当可观察链中抛出某些东西时,可观察链将以错误结束。因此,您将能够在订阅调用的 onError 选择器中对不成功的状态代码做出反应(或使用 catch, retry 和其他对错误采取行动的运算符)。

    getAllApps(gwId: Int)
      .subscribe(onNext: {
        debugPrint("Success with \([=11=])")
      }, onError: { error in
        switch error {
        case Moya.Error.statusCode(let response):
          debugPrint("Invalid status code \(response.statusCode)")
        default:
          debugPrint("An error occured: \(error)")
        }
      })