如何正确过滤 RxMoya 中的SuccessfulStatusCodes

Posted

技术标签:

【中文标题】如何正确过滤 RxMoya 中的SuccessfulStatusCodes【英文标题】:How properly filterSuccessfulStatusCodes in RxMoya 【发布时间】:2016-10-21 11:42:47 【问题描述】:

我正在使用 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())。你可以使用 try 而没有 do/chatch?(我知道用 try!/try?你可以但用 try,我只能想象 rethrow 的情况)。

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

谢谢

【问题讨论】:

【参考方案1】:

try response.filterSuccessfulStatusCodes()不在filterSuccessfulStatusCodes()的范围内,而是在flatMap的范围内。

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

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

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

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

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)")
    
  )

【讨论】:

谢谢,我后来注意到了这个范围......但是你提供了很好的答案如何处理不成功的响应

以上是关于如何正确过滤 RxMoya 中的SuccessfulStatusCodes的主要内容,如果未能解决你的问题,请参考以下文章

在 RxMoya 中重复请求

使用 RxMoya 在 RxSwift 上未获得 Completed 事件

使用 mvvm 模型的 RxMoya 请求总是在observer.onError(error) 中崩溃

如何正确过滤 ListView 中的文本?

Cannot create PoolableConnectionFactory (Communications link failure The last packet sent successfu

如何制作正确过滤本地字符的 NSPredicate?