Почему take (1) используется в конце повтора при таймере? - PullRequest
0 голосов
/ 08 июня 2019

Я смотрю на чтение из 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). Я вижу, что это происходило несколько раз по ходу книги.

1 Ответ

1 голос
/ 08 июня 2019

take(1) здесь не обязательно.take(1) удостоверился бы, что таймер не повторяется.

Observable.timer - это оператор, который периодически генерирует значение .Если параметр period по-прежнему не равен nil, в этом случае TimerOneOffSink будет создан .TimerOneOffSink испускает один элемент, а затем завершается и удаляется.

Например:

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

напечатает:

0
Completed
Disposed

Посоветовавшись с Марином Тодоровым , одним из авторов, он подтвердил, что это просто недосмотр.

Вся идея фрагмента кода заключается в ожидании между повторными попытками с использованием таймера сдлительность увеличивается на 1 секунду: результатом является пошаговая стратегия отсрочки с максимальным количеством попыток.

...