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
.
范围内使用
如果我们看一下 Observable
上 flatMap
的定义,我们会得到
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)")
}
})
我正在使用 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
.如果我们看一下
Observable
上flatMap
的定义,我们会得到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)") } })