我正在使用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。
我的第一个问题,当函数没有抛出/重新抛出时,你怎么能使用返回Observable.just(尝试response.filterSuccessfulStatusCodes())。你可以使用try withou do / chatch吗?(我知道试试!/试试?你可以尝试,我只能想象重新抛出的情况)。
第二个问题,它有一种方法可以在可观察的水平上对错误状态代码做出反应。
谢谢
答案 0 :(得分:1)
try response.filterSuccessfulStatusCodes()
未在filterSuccessfulStatusCodes()
的范围内使用,但在flatMap
中使用。
如果我们看一下flatMap
上Observable
的定义,我们就会得到
func flatMap<O: ObservableConvertibleType>(_ selector: @escaping (E) throws -> O)
-> Observable<O.E>
此处 selector
会抛出,因此我们可以使用try
。
当某个东西抛入可观察链时,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)")
}
})