Spec-Zone.ru › ReactiveX

Отложенная операция

не создавать Observable до тех пор, пока наблюдатель не подпишется, и создавать новый Observable для каждого наблюдателя
Defer

Оператор Defer ожидает, пока наблюдатель не подпишется на него, а затем генерирует Observable, обычно с помощью функции-фабрики Observable. Он делает это заново для каждого подписчика, поэтому, хотя каждый подписчик может думать, что подписывается на один и тот же Observable, на самом деле каждый подписчик получает свою собственную последовательность.

В некоторых случаях ожидание генерации Observable до последнего момента (то есть до момента подписки) может гарантировать, что этот Observable содержит самые свежие данные.

См. также:

  • Отложенный код Observable до подписки в RxJava Дэном Левом

Информация, специфичная для языка

RxGroovy defer ifThen switchCase

defer

RxGroovy реализует этот оператор как defer. Этот оператор принимает в качестве единственного параметра функцию-фабрику Observable по вашему выбору. Эта функция не принимает параметров и возвращает Observable.

defer по умолчанию не работает с конкретным расписанием.

  • Javadoc: defer()
switchCase

Существует несколько похожий оператор в необязательном пакете rxjava-computation-expressions (он не входит в стандартный набор операторов RxGroovy). Оператор switchCase условно создаёт и возвращает один из набора возможных Observable.

ifThen

Еще более простой оператор в необязательном пакете rxjava-computation-expressions (также не входит в стандартный набор операторов RxGroovy) — это ifThen. Этот оператор проверяет условие и затем либо отражает исходный Observable, либо пустой Observable, в зависимости от результата.

RxJava 1․x defer ifThen switchCase

defer

RxJava реализует этот оператор как defer. Этот оператор принимает в качестве единственного параметра функцию-фабрику Observable по вашему выбору. Эта функция не принимает параметров и возвращает Observable.

defer по умолчанию не работает с конкретным расписанием.

  • Javadoc: defer()
switchCase

Существует несколько похожий оператор в необязательном пакете rxjava-computation-expressions (он не входит в стандартный набор операторов RxJava). Оператор switchCase условно создаёт и возвращает один из набора возможных Observable.

ifThen

Еще более простой оператор в необязательном пакете rxjava-computation-expressions (также не входит в стандартный набор операторов RxGroovy) — это ifThen. Этот оператор проверяет условие и затем либо отражает исходный Observable, либо пустой Observable, в зависимости от результата.

RxJS case defer if switchCase

defer

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.js
  • rx.all.js
  • rx.all.compat.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js
if

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)
case

RxJS реализует несколько похожий оператор, называемый case (или “switchCase”). Этот оператор условно создает и возвращает один из набора возможных Observables. Он принимает следующие параметры:

  1. функцию, которая возвращает ключ, определяющий, какой Observable следует выводить
  2. объект, который сопоставляет эти ключи с конкретными Observables
  3. (необязательно) расписание 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.js
  • rx.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API