Switch

將發射 Observables 的 Observable 轉換為單一 Observable,該單一 Observable 發射由最近發射的那些 Observables 發射的項目。

Switch

Switch 訂閱一個發射 Observables 的 Observable。每次它觀察到這些發射的 Observables 之一時,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

將可觀察序列的可觀察序列轉換為僅從最近的可觀察序列產生值的可觀察序列。

範例程式碼

//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

接收一個 Observables 的 Observable,並獨佔地傳播第一個 Observable,直到它完成,然後才開始訂閱下一個 Observable。在當前 Observable 完成之前出現的 Observables 將被丟棄,並且不會傳播。此運算子類似於 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!
    

待定