Переключатель
преобразует Observable, испускающий Observables, в одно Observable, которое испускает элементы, испускаемые самым последним из этих Observables
Переключатель подписывается на Observable, который испускает Observables. Каждый раз, когда он наблюдает за одним из этих испущенных Observables, Observable, возвращаемый Переключателем, отписывается от ранее испущенного Observable и начинает испускать элементы из последнего Observable. Обратите внимание, что он отписывается от ранее испущенного Observable, когда из исходного Observable испускается новое Observable, а не когда новое Observable испускает элемент. Это означает, что элементы, испускаемые предыдущим Observable между временем испускания последующего Observable и временем, когда последующее Observable начинает испускать элементы, будут пропущены (как и жёлтый круг на диаграмме выше).
См. также
Информация, специфичная для языка
RxGroovy switchOnNext
RxGroovy реализует этот оператор как switchOnNext. По умолчанию он не работает с каким-либо конкретным Планировщиком.
- Javadoc:
switchOnNext(Observable)
RxJava 1․x switchOnNext
RxJava реализует этот оператор как switchOnNext. По умолчанию он не работает с каким-либо конкретным Планировщиком.
- Javadoc:
switchOnNext(Observable)
RxJS switch
RxJS реализует этот оператор как switch
Пример кода
var source = Rx.Observable.range(0, 3)
.select(function (x) { return Rx.Observable.range(x, 3); })
.switch();
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); });
Next: 0 Next: 1 Next: 2 Next: 3 Next: 4 Completed
switch можно найти в каждом из следующих дистрибутивов:
rx.jsrx.all.jsrx.all.compat.jsrx.compat.jsrx.lite.jsrx.lite.compat.js
RxPHP switch switchFirst
RxPHP реализует этот оператор как switch.
Преобразует последовательность Observable последовательностей Observable в последовательность Observable, которая производит значения только из последней последовательности Observable.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/switch/switch.php
$source = Rx\Observable::range(0, 3)
->map(function ($x) {
return \Rx\Observable::range($x, 3);
})
->switch();
$subscription = $source->subscribe($stdoutObserver); Next value: 0 Next value: 1 Next value: 2 Next value: 3 Next value: 4 Complete!
RxPHP также имеет оператор switchFirst.
Получает Observable последовательностей Observable и распространяет первое Observable исключительно до его завершения, прежде чем начать подписку на следующее Observable. Observables, которые появляются до завершения текущего Observable, будут отброшены и не будут распространяться. Этот оператор аналогичен concatAll(), за исключением того, что он не будет удерживать Observables, которые поступают до завершения текущего.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/switch/switchFirst.php
$source = Rx\Observable::fromArray([
\Rx\Observable::interval(100)->mapTo('a'),
\Rx\Observable::interval(200)->mapTo('b'),
\Rx\Observable::interval(300)->mapTo('c'),
])
->switchFirst()
->take(3);
$subscription = $source->subscribe($stdoutObserver); Next value: a Next value: a Next value: a Complete!
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/switch.html