0

我正在阅读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)。在本书的过程中,我多次看到这种情况发生。

4

1 回答 1

1

这里take(1)没有必要。take(1)会确保计时器不会重复。

是一个定期Observable.timer发出值的运算符。除非参数仍然是,在这种情况下将创建a 。A发出一个元素,然后完成并被处理掉。periodnilTimerOneOffSinkTimerOneOffSink

例如:

Observable<Int>
    .timer(3.0,
           scheduler: MainScheduler.instance)
    .take(10)
    .subscribe(
        onNext:      { print($0) },
        onCompleted: { print("Completed") },
        onDisposed:  { print("Disposed") }
    )

会打印:

0
Completed
Disposed

在与作者之一Marin Todorov协商后,他确认这一定只是一个疏忽。

代码片段的整个想法是使用持续时间增加 1 秒的计时器在重试之间等待:结果是具有最大尝试次数的增量退避策略。

于 2019-06-08T03:33:45.587 回答