为什么在 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 策略,具有最大尝试次数。