Switch 订阅一个发射 Observable 的 Observable。 每当它观察到这些发射的 Observable 之一,由 Switch 返回的 Observable 将取消订阅先前发射的 Observable,并开始从最新的 Observable 发射项目。 请注意,它将在源 Observable 发射新 Observable 时取消订阅先前发射的 Observable,而不是在新 Observable 发射项目时取消订阅。 这意味着,在后续 Observable 被发射以及后续 Observable 本身开始发射项目之间,先前 Observable 发射的项目将被丢弃(如上图中的黄色圆圈所示)。
待定
RxGroovy 将此操作符实现为 switchOnNext。 默认情况下,它不会对任何特定的 Scheduler 进行操作。
switchOnNext(Observable)
RxJava 将此操作符实现为 switchOnNext。 默认情况下,它不会对任何特定的 Scheduler 进行操作。
switchOnNext(Observable)
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。
将一个 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。 在当前 Observable 完成之前出现的 Observable 将被丢弃,并且不会传播。 此操作符类似于 concatAll(),只是它不会保留在当前 Observable 完成之前出现的 Observable。
//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!
待定