【发布时间】:2018-01-17 17:14:16
【问题描述】:
我有一个可以成功或失败的网络请求
我已经将它封装在一个 observable 中。 我有 2 条请求规则
1) 不能同时有超过 1 个请求
-> 我可以使用一个共享操作符
2) 请求成功后,我不想重复相同的操作 再次请求,只返回最新的值
-> 我可以为此使用 shareReplay(1) 运算符
问题出现在请求失败时,shareReplay(1) 只会重放最新的错误,不会再次重新启动请求。
该请求应在下一次订阅时重新开始。
有谁知道我如何将它变成一个 Observable 链?
// scenario 1
let obs: Observable<Int> = request().shareReplay(1)
// outputs a value
obs.subscribe()
// does not start a new request but outputs the same value as before
obs.subscribe()
// scenario 2 - in case of an error
let obs: Observable<Int> = request().shareReplay(1)
// outputs a error
obs.subscribe()
// does not start a new request but outputs the same value as before, but in this case i want it to start a new request
obs.subscribe()
这似乎是在做我想做的事,但它包括将状态保持在可观察的范围之外,有人知道我如何以更 Rx 的方式实现这一点吗?
enum Err: Swift.Error {
case x
}
enum Result<T> {
case value(val: T)
case error(err: Swift.Error)
}
func sample() {
var result: Result<Int>? = nil
var i = 0
let intSequence: Observable<Result<Int>> = Observable<Int>.create { observer in
if let result = result {
if case .value(let val) = result {
return Observable<Int>.just(val).subscribe(observer)
}
}
print("do work")
delay(1) {
if i == 0 {
observer.onError(Err.x)
} else {
observer.onNext(1)
observer.onCompleted()
}
i += 1
}
return Disposables.create {}
}
.map { value -> Result<Int> in Result.value(val: value) }
.catchError { error -> Observable<Result<Int>> in
return .just(.error(err: error))
}
.do(onNext: { result = $0 })
.share()
_ = intSequence
.debug()
.subscribe()
delay(2) {
_ = intSequence
.debug()
.subscribe()
_ = intSequence
.debug()
.subscribe()
}
delay(4) {
_ = intSequence
.debug()
.subscribe()
}
}
sample()
它只在我们没有缓存任何东西时才产生工作,但我们需要使用副作用来实现所需的输出
【问题讨论】: