如何使用maxCount(某种失败)重试网络请求,例如。 5次或直到服务器使用RxSwift的retry
运算符返回我想要的东西。
我想要做的是:
queryedSuccess
queryedFail
从服务器返回的JSON结构如下所示:
struct QueryAlipayOrderEnvelope {
var success: String // "ok" or "fail"
var tradeNumber: String
}
这是我尝试做的事情:
struct ViewModel {
var viewWillAppearTrigger = PublishSubject<Void>()
var rechargeTrigger = PublishSubject<Void>()
var outTradeNumber = PublishSubject<String>()
var queryedSuccess: Driver<QueryAlipayOrderEnvelope>
var queryedFail: Driver<QueryAlipayOrderEnvelope>
let queryResult = self.outTradeNumber.asObservable()
.flatMapLatest { tradeNum in
AppEnvironment.current.apiService.queryAlipayOrder(outTradeNumber: tradeNum).materialize().debug("queryAlipayOrder", trimOutput: true)
}
.share(replay: 1)
.retry(5)
self.queryedSuccess = queryResult
.elements()
.skipWhile { $0.success != "ok" }
.takeLast(1)
.asDriver(onErrorDriveWith: .never())
.debug("queryedSuccess", trimOutput: true)
// this will emit when all 5 `success` are `fail`
self.queryedFail = queryResult
.elements()
.takeLast(1)
.filter { $0.success != "ok" }
.asDriver(onErrorDriveWith: .never())
.debug("queryedFail", trimOutput: true)
}
但是,请求只调用一次并在没有重试的情况下处理。
答案 0 :(得分:0)
重试操作员响应onError
通知。由于您在materialize()
中使用flatMapLatest
,因此您将Observable<Element>
变为Observable<Event<Element>>
,这意味着您收到的元素会告诉您这是一个错误事件而非接收onError
通知。
尝试删除materialize()
并查看是否有帮助。