为什么在 retryWhen 计时器结束时使用 take(1)?
Why is take(1) used at the end of a retryWhen timer?
我正在阅读 RW book。
.retryWhen { errors in
return errors.enumerated().flatMap { (attempt, error) -> Observable<Int> in
if attempt >= maxAttempts - 1 {
return Observable.error(error)
}
return Observable<Int>.timer(Double(attempt + 1), scheduler:
MainScheduler.instance).take(1)
}
}
计时器没有使用 period
变量,因此它只触发一次,不会重复。那么为什么它在做 take(1)
。我在本书的过程中看到过几次这种情况。
此处不需要take(1)
。 take(1)
会确保计时器不会重复。
Observable.timer
是一个运算符,它发出值 periodically. Unless the period
parameter is still nil
, in which case a TimerOneOffSink
would be created. A TimerOneOffSink
emits one 元素,然后完成并被处理掉。
例如:
Observable<Int>
.timer(3.0,
scheduler: MainScheduler.instance)
.take(10)
.subscribe(
onNext: { print([=10=]) },
onCompleted: { print("Completed") },
onDisposed: { print("Disposed") }
)
将打印:
0
Completed
Disposed
在咨询了其中一位作者 Marin Todorov 后,他确认这一定只是一个疏忽。
代码片段的整体思路是使用持续时间增加 1 秒的计时器在重试之间等待:结果是增量 back-off 策略,具有最大尝试次数。
我正在阅读 RW book。
.retryWhen { errors in
return errors.enumerated().flatMap { (attempt, error) -> Observable<Int> in
if attempt >= maxAttempts - 1 {
return Observable.error(error)
}
return Observable<Int>.timer(Double(attempt + 1), scheduler:
MainScheduler.instance).take(1)
}
}
计时器没有使用 period
变量,因此它只触发一次,不会重复。那么为什么它在做 take(1)
。我在本书的过程中看到过几次这种情况。
此处不需要take(1)
。 take(1)
会确保计时器不会重复。
Observable.timer
是一个运算符,它发出值 periodically. Unless the period
parameter is still nil
, in which case a TimerOneOffSink
would be created. A TimerOneOffSink
emits one 元素,然后完成并被处理掉。
例如:
Observable<Int>
.timer(3.0,
scheduler: MainScheduler.instance)
.take(10)
.subscribe(
onNext: { print([=10=]) },
onCompleted: { print("Completed") },
onDisposed: { print("Disposed") }
)
将打印:
0
Completed
Disposed
在咨询了其中一位作者 Marin Todorov 后,他确认这一定只是一个疏忽。
代码片段的整体思路是使用持续时间增加 1 秒的计时器在重试之间等待:结果是增量 back-off 策略,具有最大尝试次数。