0

我正在使用 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 的实现使用了 Moya.Resposne 的公共实例函数和这个实现:

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

正如你所看到的,这个东西会抛出异常......但是上面的函数,它不会重新抛出,它返回的是泛型 E 的 Observable。

我的第一个问题,当函数不抛出/重新抛出时,你为什么可以使用 return Observable.just(try response.filterSuccessfulStatusCodes())。你可以在没有做/chatch 的情况下使用 try?(我知道用 try!/try?你可以,但用 try,我只能想象 rethrow 的情况)。

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

谢谢

4

1 回答 1

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

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

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

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

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

    getAllApps(gwId: Int)
      .subscribe(onNext: {
        debugPrint("Success with \($0)")
      }, onError: { error in
        switch error {
        case Moya.Error.statusCode(let response):
          debugPrint("Invalid status code \(response.statusCode)")
        default:
          debugPrint("An error occured: \(error)")
        }
      })
    
于 2016-10-24T05:17:24.127 回答