Spec-Zone.ru › ReactiveX

Действие

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

Вы можете зарегистрировать обратные вызовы, которые ReactiveX будет вызывать, когда на Observable происходят определённые события. Эти обратные вызовы будут вызываться независимо от обычных уведомлений, связанных с каскадом Observable. Существует множество операторов, разработанных различными реализациями ReactiveX для этого.

См. также

  • Подписка
  • Введение в Rx: Действие
  • Введение в Rx: Наконец

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

RxGroovy doOnCompleted doOnEach doOnError doOnNext doOnRequest doOnSubscribe doOnTerminate doOnUnsubscribe finallyDo

RxGroovy имеет несколько вариантов Действия.

doOnEach

Оператор doOnEach позволяет вам установить обратный вызов, который результирующее Observable будет вызывать каждый раз, когда оно испускает элемент. Вы можете передать этот обратный вызов в виде Action, который принимает onNext различные Notification в качестве единственного параметра, или вы можете передать наблюдателя, чья методика onNext будет вызвана так, как если бы он подписался на Observable.

  • Javadoc: doOnEach(Action1)
  • Javadoc: doOnEach(Observer)
doOnNext

Оператор doOnNext очень похож на doOnEach(Action1), за исключением того, что Action передаваемый вами в качестве параметра не принимает Notification, а вместо этого просто принимает испущенный элемент.

  • Javadoc: doOnNext(Action1)

Оператор doOnRequest (новый в RxGroovy 1.1) регистрирует Action, который будет вызываться всякий раз, когда наблюдатель запрашивает дополнительные элементы из результирующего Observable. Этот Action получает в качестве параметра количество запрашиваемых элементов.

  • Javadoc: doOnRequest(Action1)
doOnSubscribe

Оператор doOnSubscribe регистрирует Action, который будет вызываться всякий раз, когда наблюдатель подписывается на результирующее Observable.

  • Javadoc: doOnSubscribe(Action0)
doOnUnsubscribe

Оператор doOnUnsubscribe регистрирует Action, который будет вызываться всякий раз, когда наблюдатель отписывается от результирующего Observable.

  • Javadoc: doOnUnsubscribe(Action0)
doOnCompleted

Оператор doOnCompleted регистрирует Action, который будет вызываться, если результирующее Observable завершается нормально, вызвав onCompleted.

  • Javadoc: doOnCompleted(Action0)
doOnError

Оператор doOnError регистрирует Action, который будет вызываться, если результирующее Observable завершается аномально, вызвав onError. Этот Action будет передан Throwable представляющий ошибку.

  • Javadoc: doOnError(Action1)
doOnTerminate

Оператор doOnTerminate регистрирует Action, который будет вызываться непосредственно перед завершением результирующего Observable, независимо от того, нормально оно завершилось или с ошибкой.

  • Javadoc: doOnTerminate(Action0)
finallyDo

Оператор finallyDo регистрирует Action, который будет вызываться непосредственно после завершения результирующего Observable, независимо от того, нормально оно завершилось или с ошибкой.

Пример кода

def numbers = Observable.from([1, 2, 3, 4, 5]);

numbers.finallyDo({ println('Finally'); }).subscribe(
   { println(it); },                          // onNext
   { println("Error: " + it.getMessage()); }, // onError
   { println("Sequence complete"); }          // onCompleted
);
1
2
3
4
5
Sequence complete
Finally
  • Javadoc: finallyDo(Action0)

RxJava 1․x doOnCompleted doOnEach doOnError doOnNext doOnRequest doOnSubscribe doOnTerminate doOnUnsubscribe finallyDo doAfterTerminate

RxJava имеет несколько вариантов Действия.

doOnEach

Оператор doOnEach позволяет вам установить обратный вызов, который результирующее Observable будет вызывать каждый раз, когда оно испускает элемент. Вы можете передать этот обратный вызов в виде Action, который принимает onNext различные Notification в качестве единственного параметра, или вы можете передать наблюдателя, чья методика onNext будет вызвана так, как если бы он подписался на Observable.

  • Javadoc: doOnEach(Action1)
  • Javadoc: doOnEach(Observer)
doOnNext

Оператор doOnNext очень похож на doOnEach(Action1), за исключением того, что Action передаваемый вами в качестве параметра не принимает Notification, а вместо этого просто принимает испущенный элемент.

Пример кода

Observable.just(1, 2, 3)
          .doOnNext(new Action1<Integer>() {
          @Override
          public void call(Integer item) {
            if( item > 1 ) {
              throw new RuntimeException( "Item exceeds maximum value" );
            }
          }
        }).subscribe(new Subscriber<Integer>() {
        @Override
        public void onNext(Integer item) {
            System.out.println("Next: " + item);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }
    });
Next: 1
Error: Item exceeds maximum value
  • Javadoc: doOnNext(Action1)

Оператор doOnRequest (новый в RxJava 1.1) регистрирует Action, который будет вызываться всякий раз, когда наблюдатель запрашивает дополнительные элементы из результирующего Observable. Этот Action получает в качестве параметра количество запрашиваемых элементов.

  • Javadoc: doOnRequest(Action1)
doOnSubscribe

Оператор doOnSubscribe регистрирует Action, который будет вызываться всякий раз, когда наблюдатель подписывается на результирующее Observable.

  • Javadoc: doOnSubscribe(Action0)
doOnUnsubscribe

Оператор doOnUnsubscribe регистрирует Action, который будет вызываться всякий раз, когда наблюдатель отписывается от результирующего Observable.

  • Javadoc: doOnUnsubscribe(Action0)
doOnCompleted

Оператор doOnCompleted регистрирует Action, который будет вызываться, если результирующее Observable завершается нормально, вызвав onCompleted.

  • Javadoc: doOnCompleted(Action0)
doOnError

Оператор doOnError регистрирует Action, который будет вызываться, если результирующее Observable завершается аномально, вызвав onError. Этот Action будет передан Throwable представляющий ошибку.

  • Javadoc: doOnError(Action1)
doOnTerminate

Оператор doOnTerminate регистрирует Action, который будет вызываться непосредственно перед завершением результирующего Observable, независимо от того, нормально оно завершилось или с ошибкой.

  • Javadoc: doOnTerminate(Action0)
finallyDo

Оператор finallyDo устарел с RxJava 1.1.1 в пользу doAfterTerminate с тем же поведением.

Оператор finallyDo регистрирует Action, который будет вызываться непосредственно после завершения результирующего Observable, независимо от того, нормально оно завершилось или с ошибкой.

  • Javadoc: finallyDo(Action0)
doAfterTerminate

Оператор doAfterTerminate регистрирует Action, который будет вызываться непосредственно после завершения результирующего Observable, независимо от того, нормально оно завершилось или с ошибкой.

  • Javadoc: doAfterTerminate(Action0)

RxJS do doOnCompleted doOnError doOnNext finally tap tapOnCompleted tapOnError tapOnNext

do

RxJS реализует базовый оператор Do как do или tap (два названия для одного оператора). У вас есть два варианта использования этого оператора:

  1. Вы можете передать ему наблюдатель, в этом случае do/tap вызовет методы этого наблюдателя так, как будто этот наблюдатель подписался на полученный Observable.
  2. Вы можете передать набор из 1–3 отдельных функций (onNext, onError, и onCompleted), которые do/tap вызовут вместе с аналогично названными функциями любого из его наблюдателей.

Пример кода

/* Using an observer */
var observer = Rx.Observer.create(
  function (x) { console.log('Do Next: %s', x); },
  function (err) { console.log('Do Error: %s', err); },
  function () { console.log('Do Completed'); }
);

var source = Rx.Observable.range(0, 3)
    .do(observer);

var subscription = source.subscribe(
  function (x) { console.log('Next: %s', x); },
  function (err) { console.log('Error: %s', err); },
  function () { console.log('Completed'); });
Do Next: 0
Next: 0
Do Next: 1
Next: 1
Do Next: 2
Next: 2
Do Completed
Completed
/* Using a function */
var source = Rx.Observable.range(0, 3)
  .do(
    function (x)   { console.log('Do Next:', x); },
    function (err) { console.log('Do Error:', err); },
    function ()    { console.log('Do Completed'); }
  );

var subscription = source.subscribe(
  function (x) { console.log('Next: %s', x); },
  function (err) { console.log('Error: %s', err); },
  function () { console.log('Completed'); });
Do Next: 0
Next: 0
Do Next: 1
Next: 1
Do Next: 2
Next: 2
Do Completed
Completed
doOnNext

RxJS также реализует оператор doOnNext или tapOnNext (два названия для одного оператора). Это специализированная форма оператора Do, которая реагирует только на случай onNext, вызывая предоставленную вами функцию обратного вызова в качестве параметра. Вы также можете необязательно передать второй параметр, который будет объектом «this» с точки зрения вашей функции обратного вызова при её выполнении.

Пример кода

var source = Rx.Observable.range(0, 3)
  .doOnNext(
    function () { this.log('Do Next: %s', x); },
    console
  );

var subscription = source.subscribe(
  function (x) { console.log('Next: %s', x); },
  function (err) { console.log('Error: %s', err); },
  function () { console.log('Completed'); });
Do Next: 0
Next: 0
Do Next: 1
Next: 1
Do Next: 2
Next: 2
Completed
doOnError

RxJS также реализует оператор doOnError или tapOnError (два названия для одного оператора). Это специализированная форма оператора Do, которая реагирует только на случай onError, вызывая предоставленную вами функцию обратного вызова в качестве параметра. Вы также можете необязательно передать второй параметр, который будет объектом «this» с точки зрения вашей функции обратного вызова при её выполнении.

Пример кода

var source = Rx.Observable.throw(new Error());
  .doOnError(
    function (err) { this.log('Do Error: %s', err); },
    console
  );

var subscription = source.subscribe(
  function (x) { console.log('Next: %s', x); },
  function (err) { console.log('Error: %s', err); },
  function () { console.log('Completed'); });
Do Error: Error
Error: Error
doOnCompleted

RxJS также реализует оператор doOnCompleted или tapOnCompleted (два названия для одного оператора). Это специализированная форма оператора Do, которая реагирует только на случай onCompleted, вызывая предоставленную вами функцию обратного вызова в качестве параметра. Вы также можете необязательно передать второй параметр, который будет объектом «this» с точки зрения вашей функции обратного вызова при её выполнении.

Пример кода

var source = Rx.Observable.range(0, 3)
  .doOnCompleted(
    function () { this.log('Do Completed'); },
    console
  );

var subscription = source.subscribe(
  function (x) { console.log('Next: %s', x); },
  function (err) { console.log('Error: %s', err); },
  function () { console.log('Completed'); });
Next: 0
Next: 1
Next: 2
Do Completed
Completed
finally

RxJS также реализует оператор finally. Он принимает функцию, которая будет вызвана после завершения полученного Observable, будь то нормально (onCompleted) или аномально (onError).

Пример кода

var source = Rx.Observable.throw(new Error())
    .finally(function () {
        console.log('Finally');
    });

var subscription = source.subscribe(
  function (x) { console.log('Next: ' + x); },
  function (err) { console.log('Error: ' + err); },
  function () { console.log('Completed'); });
Error: Error
Finally

do/tap, doOnNext/tapOnNext, doOnError/tapOnError, doOnCompleted/tapOnCompleted, и finally находятся в каждом из следующих дистрибутивов:

  • rx.js
  • rx.all.js
  • rx.all.compat.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

RxPHP do doOnError doOnCompleted finally

RxPHP реализует этот оператор как do.

Вызывает действие для каждого элемента в последовательности observable и вызывает действие при благополучном или исключительном завершении последовательности observable. Этот метод может использоваться для отладки, ведения журнала и т. п. поведения запроса путём перехвата потока сообщений для выполнения произвольных действий для сообщений в конвейере. При использовании do важно отметить, что наблюдатель может получить дополнительные события после завершения или ошибки потока (например, при использовании repeat или повторной подписки). Если вы используете Observable, который расширяет AbstractObservable, вы не получите эти события. В этом специальном случае используйте DoObserver. doOnNext, doOnError и doOnCompleted используют DoObserver внутри и получат эти дополнительные события.

Пример кода

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/do/do.php

$source = \Rx\Observable::range(0, 3)
    ->do(
        function ($x) {
            echo 'Do Next:', $x, PHP_EOL;
        },
        function (Throwable $err) {
            echo 'Do Error:', $err->getMessage(), PHP_EOL;
        },
        function () {
            echo 'Do Completed', PHP_EOL;
        }
    );

$subscription = $source->subscribe($stdoutObserver);
Do Next:0
Next value: 0
Do Next:1
Next value: 1
Do Next:2
Next value: 2
Do Completed
Complete!

RxPHP также имеет оператор doOnError.

Пример кода

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/do/doOnError.php

$source = \Rx\Observable::error(new Exception('Oops'))
    ->doOnError(function (Throwable $err) {
        echo 'Do Error:', $err->getMessage(), PHP_EOL;
    });

$subscription = $source->subscribe($stdoutObserver);
Do Error:Oops
Exception: Oops

RxPHP также имеет оператор doOnCompleted.

Пример кода

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/do/doOnCompleted.php

$source = \Rx\Observable::empty()
    ->doOnCompleted(function () {
        echo 'Do Completed', PHP_EOL;
    });

$subscription = $source->subscribe($stdoutObserver);
Do Completed
Complete!

RxPHP также имеет оператор finally.

Вызовет указанную функцию, когда источник завершится успешно или с ошибкой.

Пример кода

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/finally/finally.php

Rx\Observable::range(1, 3)
    ->finally(function() {
        echo "Finally\n";
    })
    ->subscribe($stdoutObserver);
Next value: 1
Next value: 2
Next value: 3
Complete!
Finally
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/finally/finally-error.php

Rx\Observable::range(1, 3)
    ->map(function($value) {
        if ($value == 2) {
            throw new \Exception('error');
        }
        return $value;
    })
    ->finally(function() {
        echo "Finally\n";
    })
    ->subscribe($stdoutObserver);
Next value: 1
Exception: error
Finally

© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/do.html

Spec-Zone.ru

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