2016-12-06 63 views
1

使用RxJS 5,這可能嗎?是否有可能從像event.stopPropagation用戶內發射停止Rx.Subject?

var source = new Rx.Subject(); 

source.map((data) => {console.log('map1'); return data;}) 
    .subscribe((data) => { 
     console.log('subscribe1', data); 
     if(someCondition) { 
      source.stop(); //???????? 
     } 
    }); 

source.map((data) => {console.log('map2'); return data;}) 
    .subscribe((data) => { 
     console.log('subscribe2', data); 
    }); 

因此,當我打電話給source.next("Hello World");時,只有第一個用戶會被通知。當然,這將在source.stop()失敗,因爲stop功能不存在,但它只是闡述我的問題。

存在的方式做到這一點,像event.stopPropagation嗎?

回答

2

這取決於你希望通過停止傳播做。你可以打電話source.complete()這將停止主題,它不會再發射任何東西。

觀看演示:https://jsbin.com/geyucuc/3/edit?js,console

不過,如果你希望能夠在工作「每個項目的基礎上:」你不能你有,因爲現在從source每個值由發出它的兩個用戶結構主題。

您沒有價值如下的鏈條source =>subscribe1 =>subscribe2

現在你有source =>subscribe1然後source =>subscribe2

所以,你可以把它的鏈條是這樣的例子:

var source = new Rx.Subject(); 

source 
    .map(item => { // wrap this 
     return { value: item, stopped: false }; 
    }) 
    // your logic 
    .map((data) => { 
     console.log('map1', data.value); 
     // do whatever here 
     if (data.value == 2) { 
      data.stopped = true; 
     } 
     return data; 
    }) 
    .filter(item => !item.stopped) // this is your stopPropagation() 
    .map((data) => { 
     // do whatever here 
     console.log('map2', data.value); 
     return data; 
    }) 
    .subscribe((data) => { 
     // do nothing here, just construct the chain. 
    }); 

source.next(1); 
source.next(2); 

打印出以下幾點:

map1 1 
map2 1 
map1 2 
+0

現在我就在畫面右側。那麼,如果'filter'返回'false',下一個地圖將不會被調用? –

+0

我知道你解釋,我沒有一個鏈條,但該用戶在他們訂購相同的順序運行,並不能使它鏈? RxJS應該提供一種方式來說:「嘿,不要再發射了」。或者,這是出於Observable模式? –

+0

@CastroRoy如果'source'將項目發送給'subscribe1',然後'subscribe1'發送給'subscribe2',我會是一個鏈。這樣'subscribe1'可以控制它發送的值。它可能會修改它不發送它。另一方面,當你有'source'和兩個訂閱者時,他們彼此獨立地接收這個值。如果'filter()'返回false,則該值不會傳播給後續的操作員。 – martin

相關問題