Отложенная операция
не создавать Observable до тех пор, пока наблюдатель не подпишется, и создавать новый Observable для каждого наблюдателя
Оператор Defer ожидает, пока наблюдатель не подпишется на него, а затем генерирует Observable, обычно с помощью функции-фабрики Observable. Он делает это заново для каждого подписчика, поэтому, хотя каждый подписчик может думать, что подписывается на один и тот же Observable, на самом деле каждый подписчик получает свою собственную последовательность.
В некоторых случаях ожидание генерации Observable до последнего момента (то есть до момента подписки) может гарантировать, что этот Observable содержит самые свежие данные.
См. также:
- Отложенный код Observable до подписки в RxJava Дэном Левом
Информация, специфичная для языка
RxGroovy defer ifThen switchCase
RxGroovy реализует этот оператор как defer. Этот оператор принимает в качестве единственного параметра функцию-фабрику Observable по вашему выбору. Эта функция не принимает параметров и возвращает Observable.
defer по умолчанию не работает с конкретным расписанием.
- Javadoc:
defer()
Существует несколько похожий оператор в необязательном пакете rxjava-computation-expressions (он не входит в стандартный набор операторов RxGroovy). Оператор switchCase условно создаёт и возвращает один из набора возможных Observable.
Еще более простой оператор в необязательном пакете rxjava-computation-expressions (также не входит в стандартный набор операторов RxGroovy) — это ifThen. Этот оператор проверяет условие и затем либо отражает исходный Observable, либо пустой Observable, в зависимости от результата.
RxJava 1․x defer ifThen switchCase
RxJava реализует этот оператор как defer. Этот оператор принимает в качестве единственного параметра функцию-фабрику Observable по вашему выбору. Эта функция не принимает параметров и возвращает Observable.
defer по умолчанию не работает с конкретным расписанием.
- Javadoc:
defer()
Существует несколько похожий оператор в необязательном пакете rxjava-computation-expressions (он не входит в стандартный набор операторов RxJava). Оператор switchCase условно создаёт и возвращает один из набора возможных Observable.
Еще более простой оператор в необязательном пакете rxjava-computation-expressions (также не входит в стандартный набор операторов RxGroovy) — это ifThen. Этот оператор проверяет условие и затем либо отражает исходный Observable, либо пустой Observable, в зависимости от результата.
RxJS case defer if switchCase
RxJS реализует этот оператор как defer. Этот оператор принимает в качестве единственного параметра функцию-фабрику Observable по вашему выбору. Эта функция не принимает параметров и возвращает Observable или Promise.
Пример кода
/* Using an observable sequence */
var source = Rx.Observable.defer(function () {
return Rx.Observable.return(42);
});
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); } ); Next: 42 Completed
var source = Rx.Observable.defer(function () {
return RSVP.Promise.resolve(42);
});
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); } ); Next: 42 Completed
defer можно найти в следующих дистрибутивах:
rx.jsrx.all.jsrx.all.compat.jsrx.compat.jsrx.lite.jsrx.lite.compat.js
RxJS также реализует оператор if. Он принимает в качестве параметров функцию, возвращающую булево значение, Observable для отражения, если эта функция возвращает true, и необязательно второй Observable для отражения, если эта функция возвращает false (если вы опустите этот параметр, if в таком случае отразит пустой Observable).
Пример кода
var shouldRun = false;
var source = Rx.Observable.if(
function () { return shouldRun; },
Rx.Observable.return(42),
Rx.Observable.return(56)
);
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: 56 Completed
if можно найти в следующих дистрибутивах:
rx.all.js-
rx.experimental.js(требуетrx.js,rx.compat.js,rx.lite.js, илиrx.lite.compat.js)
RxJS реализует несколько похожий оператор, называемый case (или “switchCase”). Этот оператор условно создает и возвращает один из набора возможных Observables. Он принимает следующие параметры:
- функцию, которая возвращает ключ, определяющий, какой Observable следует выводить
- объект, который сопоставляет эти ключи с конкретными Observables
- (необязательно) расписание Scheduler или Observable:
- Scheduler
- расписание, которое вы хотите использовать для этого оператора
- Observable
- по умолчанию Observable, который следует выводить, если ключ не связан ни с одним Observable
Пример кода
var sources = {
'foo': Rx.Observable.return(42),
'bar': Rx.Observable.return(56)
};
var defaultSource = Rx.Observable.empty();
var source = Rx.Observable.case(
function () {
return 'foo';
},
sources,
defaultSource);
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); } ); Next: 42 Completed
case/switchCase можно найти в следующих дистрибутивах:
rx.all.jsrx.all.compat.js-
rx.experimental.js(требуетrx.js,rx.compat.js,rx.lite.js, илиrx.lite.compat.js)
RxPHP defer
RxPHP реализует этот оператор как defer.
Возвращает последовательность Observable, которая вызывает указанную функцию-фабрику всякий раз, когда подписывается новый наблюдатель.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/defer/defer.php
$source = \Rx\Observable::defer(function () {
return \Rx\Observable::of(42);
});
$subscription = $source->subscribe($stdoutObserver); Next value: 42 Complete!
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/defer.html