Задержка
сдвинуть выбросы из Observable вперёд во времени на определённое количество
Оператор Задержка модифицирует исходное Observable, приостанавливая выполнение на определённый интервал времени (который вы указываете) перед выбросом каждого элемента исходного Observable. Это эквивалентно сдвигу всей последовательности элементов, выброшенных Observable, вперёд во времени на указанный интервал.
См. также
- Введение в Rx: Задержка
- RxMarbles:
delay - RxMarbles:
delayWithSelector - 101 Примеры Rx: Задержка — Простой пример
Информация, специфичная для языка
RxGroovy delay delaySubscription
RxGroovy реализует этот оператор как варианты delay и delaySubscription.
Первый вариант delay принимает параметры, определяющие длительность (величина времени и TimeUnit, в которых выражена эта величина). Каждый раз, когда исходное Observable выбрасывает элемент, delay запускает таймер, и когда этот таймер достигает заданной длительности, возвращаемое Observable из delay выбрасывает тот же элемент.
Обратите внимание, что delay не будет сдвигать уведомление onError таким образом, но перешлет такое уведомление своим подписчикам немедленно, отбросив любые ожидающие уведомления onNext. Однако, он будет сдвигать уведомление onCompleted.
По умолчанию этот вариант delay работает на computation Scheduler, но вы можете выбрать другой Scheduler, передав его в качестве необязательного третьего параметра delay
- Javadoc:
delay(long,TimeUnit) - Javadoc:
delay()
Другой вариант delay не использует постоянную длительность задержки, а устанавливает длительность задержки для каждого элемента, передавая каждый элемент из исходного Observable в функцию, которая возвращает Observable, а затем отслеживая эти Observables. Когда любое из таких Observable выбрасывает элемент или завершается, Observable, возвращаемое delay, выбрасывает соответствующий элемент.
Этот вариант delay по умолчанию не выполняется на каком-либо конкретном Scheduler.
- Javadoc:
delay(Func1)
Вариант delay, использующий Observable для установки задержки, имеет вариант, позволяющий передать функцию, возвращающую Observable, действующее как таймер задержки для подписки на исходное Observable (в отсутствие этого delay подписывается на исходное Observable сразу после того, как наблюдатель подпишется на Observable, возвращаемое delay).
Этот вариант delay по умолчанию не выполняется на каком-либо конкретном Scheduler.
- Javadoc:
delay(Func0,Func1)
Также есть оператор, с помощью которого можно отложить подписку на исходное Observable: delaySubscription. Он принимает параметры, определяющие время задержки (величина времени и TimeUnit, в которых выражена эта величина).
Этот вариант delay по умолчанию работает на computation Scheduler, но вы можете выбрать другой Scheduler, передав его в качестве необязательного третьего параметра delaySubscription
- Javadoc:
delaySubscription(long,TimeUnit) - Javadoc:
delaySubscription(long,TimeUnit,Scheduler)
И есть вариант delaySubscription, который использует Observable (возвращаемое функцией, которую вы предоставляете) вместо фиксированной длительности, чтобы установить задержку подписки.
Этот вариант delaySubscription по умолчанию не выполняется на каком-либо конкретном Scheduler.
- Javadoc:
delaySubscription(Func0)
RxJava 1․x delay delaySubscription
RxJava реализует этот оператор как варианты delay и delaySubscription.
Первый вариант delay принимает параметры, определяющие длительность (величина времени и TimeUnit, в которых выражена эта величина). Каждый раз, когда исходное Observable выбрасывает элемент, delay запускает таймер, и когда этот таймер достигает заданной длительности, возвращаемое Observable из delay выбрасывает тот же элемент.
Обратите внимание, что delay не будет сдвигать уведомление onError таким образом, но перешлет такое уведомление своим подписчикам немедленно, отбросив любые ожидающие уведомления onNext. Однако, он будет сдвигать уведомление onCompleted.
По умолчанию этот вариант delay работает на computation Scheduler, но вы можете выбрать другой Scheduler, передав его в качестве необязательного третьего параметра delay
- Javadoc:
delay(long,TimeUnit) - Javadoc:
delay()
Другой вариант delay не использует постоянную длительность задержки, а устанавливает длительность задержки для каждого элемента, передавая каждый элемент из исходного Observable в функцию, которая возвращает Observable, а затем отслеживая эти Observables. Когда любое из таких Observable выбрасывает элемент или завершается, Observable, возвращаемое delay, выбрасывает соответствующий элемент.
Этот вариант delay по умолчанию не выполняется на каком-либо конкретном Scheduler.
- Javadoc:
delay(Func1)
Вариант delay , использующий Observable для установки задержки, имеет вариант, позволяющий передать функцию, возвращающую Observable, действующее как таймер задержки для подписки на исходное Observable (в отсутствие этого delay подписывается на исходное Observable сразу после того, как наблюдатель подпишется на Observable, возвращаемое delay).
Этот вариант delay по умолчанию не выполняется на каком-либо конкретном Scheduler.
- Javadoc:
delay(Func0,Func1)
Также есть оператор, с помощью которого можно отложить подписку на исходное Observable: delaySubscription. Он принимает параметры, определяющие время задержки (величина времени и TimeUnit, в которых выражена эта величина).
Этот вариант delay по умолчанию работает на computation Scheduler, но вы можете выбрать другой Scheduler, передав его в качестве необязательного третьего параметра delaySubscription
- Javadoc:
delaySubscription(long,TimeUnit) - Javadoc:
delaySubscription(long,TimeUnit,Scheduler)
И есть вариант delaySubscription, который использует Observable (возвращаемое функцией, которую вы предоставляете) вместо фиксированной длительности, чтобы установить задержку подписки.
Этот вариант delaySubscription по умолчанию не выполняется на каком-либо конкретном Scheduler.
- Javadoc:
delaySubscription(Func0)
RxJS delay delaySubscription delayWithSelector
В RxJS вы можете установить задержку на элемент в двух способах: передав число миллисекунд в оператор delay (который задержит каждую эмиссию на это количество времени), или передав объект Date (который задержит начало последовательности эмиссий до этой абсолютной точки во времени).
Этот оператор по умолчанию работает на timeout планировщике, но вы можете переопределить это, передав другой планировщик в качестве необязательного второго параметра.
Пример кода
var source = Rx.Observable.range(0, 3)
.delay(new Date(Date.now() + 1000));
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x.toString()); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: 0 Next: 1 Next: 2 Completed
var source = Rx.Observable.range(0, 3)
.delay(1000);
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x.toString()); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: 0 Next: 1 Next: 2 Completed
delaySubscription похож на delay, но вместо сдвига во времени эмиссий из исходного Observable, он сдвигает момент подписки на это Observable. Вы передаёте в этот оператор значение времени (либо Number, в этом случае это устанавливает количество миллисекунд задержки, либо Date, в этом случае это устанавливает абсолютное будущее время, в котором delaySubscription запустит подписку). Вы можете необязательно передать планировщик в качестве второго параметра, который delaySubscription будет использовать для управления периодом задержки или временем срабатывания.
Пример кода
var start = Date.now();
var source = Rx.Observable.range(0, 3).delaySubscription(5000);
var subscription = source.subscribe(
function (x) { console.log('Next: %s, %s', x, Date.now() - start); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: 0, 5001 Next: 1, 5002 Next: 2, 5003 Completed
delayWithSelector подобен delay, но не использует постоянную длительность задержки (или абсолютное время), а устанавливает длительность задержки для каждого элемента, передавая каждый элемент из исходного Observable в функцию, которая возвращает Observable, а затем отслеживая эти Observables. Когда любое такое Observable завершается, Observable, возвращаемое delay, испускает связанный элемент.
Пример кода
var source = Rx.Observable
.range(0, 3)
.delayWithSelector(
function (x) {
return Rx.Observable.timer(x * 400);
})
.timeInterval()
.map(function (x) { return x.value + ':' + x.interval; });
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: 0:0 Next: 1:400 Next: 2:400 Completed
Также существует версия delayWithSelector, которая принимает дополнительный (первый) аргумент: Observable, который устанавливает задержку перед тем, как delayWithSelector подпишется на исходное Observable после того, как сам подпишется на него.
Пример кода
var source = Rx.Observable
.range(0, 3)
.delayWithSelector(
Rx.Observable.timer(300),
function (x) {
return Rx.Observable.timer(x * 400);
}
)
.timeInterval()
.map(function (x) { return x.value + ':' + x.interval; });
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: 0:300 Next: 1:400 Next: 2:400 Completed
delay, delaySubscription, и delayWithSelector требуют rx.lite.js или rx.lite.compat.js и находятся в каждой из следующих дистрибуций:
rx.all.jsrx.all.compat.js-
rx.time.js(требуетrx.jsилиrx.compat.js)
RxPHP delay
RxPHP реализует этот оператор как delay.
Сдвигает последовательность Observable на dueTime. Относительные интервалы времени между значениями сохраняются.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/delay/delay.php
\Rx\Observable::interval(1000)
->doOnNext(function ($x) {
echo 'Side effect: ' . $x . "\n";
})
->delay(500)
->take(5)
->subscribe($createStdoutObserver()); Side effect: 0 Next value: 0 Side effect: 1 Next value: 1 Side effect: 2 Next value: 2 Side effect: 3 Next value: 3 Side effect: 4 Next value: 4 Complete!
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/delay.html