Switch

将一个发射 Observable 的 Observable 转换为一个单一的 Observable,它发射从最近发射的那些 Observable 中发射的项目。

Switch

Switch 订阅一个发射 Observable 的 Observable。 每当它观察到这些发射的 Observable 之一,由 Switch 返回的 Observable 将取消订阅先前发射的 Observable,并开始从最新的 Observable 发射项目。 请注意,它将在源 Observable 发射新 Observable 时取消订阅先前发射的 Observable,而不是在新 Observable 发射项目时取消订阅。 这意味着,在后续 Observable 被发射以及后续 Observable 本身开始发射项目之间,先前 Observable 发射的项目将被丢弃(如上图中的黄色圆圈所示)。

另请参阅

特定语言信息

待定

switch

RxGroovy 将此操作符实现为 switchOnNext。 默认情况下,它不会对任何特定的 Scheduler 进行操作。

switch

RxJava 将此操作符实现为 switchOnNext。 默认情况下,它不会对任何特定的 Scheduler 进行操作。

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

待定