2017-12-27 286 views
0

我有一個角度服務,我想暴露一個observable,它充當邏輯「或」的類。假設我有多個源序列可以給出onoff的值。我需要輸出true任何時候任何東西都是on,並且當所有值爲off時返回falserxjs中是否有邏輯或類型的運算符?

例子:

const replaceInput = input => input === 'on' ? 'off' : 'on'; 
const getSource = (name) => Observable.interval(1000) 
    .scan(
     input => Math.random() > 0.5 ? replaceInput(input) : input, 
     'off' // initial value 
    ) 
    .do(val => console.log(`${name}: ${val}); 

const first$ = getSource('first'); 
const second$ = getSource('second'); 
const result$ = ???; 

現在,我已經試過result$ = Observable.merge(first$, second$),但給人總是on。我也嘗試過使用result$ = combineLatest(first$, second$),所以這有點不錯,但是我的輸入不同步,所以並不總是完美的。我的意思是,第一美元可能放出一個以上的價值,而第二美元可能永遠不會開火,反之亦然。我還可以做些什麼?

我想過一些mergeMap或類似的,然後保持外部上下文的狀態,這種方式我運行任何事件的更新。但是當我遇到問題時,「關閉」事件可能意味着「關閉」,但是隻有其他序列也是「關閉」的時候,所以它很快就會變得棘手。

+0

您可以使用篩選器操作,放出只有當值匹配根據您的要求, –

+0

那麼,什麼將是什麼樣子? – Zlatko

+0

在你的代碼中看起來對我來說,一旦輸入'打開',沒有邏輯將其設置爲關閉 –

回答

1

實際上,你給出的答案基本上都是自己:

const result$ = Observable.combineLatest(first$, second$) 
    .map(values => values.some(value => value === 'on')); 

使有些好的,但我的輸入是不同步的,所以它並不總是完美的。

我不明白你的意思,說實話。你在你的問題中明確表達了你想要的:

我需要在任何時候輸出任何東西。

因此,如果輸入發生變化時,它們之間會有一段時間延遲,您將得到一箇中間結果狀態。這與你的問題完全一致。

如果你想以某種方式等待所有輸入改變,因爲他們可能會在同一時間發生改變,您可以添加一個debounceTime到它:

const result$ = Observable.combineLatest(first$, second$) 
    .debounceTime(100) 
    .map(values => values.some(value => value === 'on')); 

或者,如果你想抑制false排放,只是過濾它們:

const result$ = Observable.combineLatest(first$, second$) 
    .map(values => values.some(value => value === 'on')) 
    .filter(Boolean); // sneaky trick; you can also use "value => value" 

你當然可以將兩者結合起來。

+0

但是不合並最後發射兩個值的數組? – Zlatko

+0

並且observable.merge在第一個真實事件上給出'on',然後永遠保持'on'。 – Zlatko

+0

哦,但我也需要切換回'假'。我的答案中缺少這一點。 – Zlatko

2

看,如果這是你尋找什麼

let randomInput=()=>Rx.Observable.interval(1000) 
.map(()=>Math.random()>0.5?'on':'off') 
.startWith('off') 
.map(value=>value==='on'?true:false) 

Rx.Observable.combineLatest(randomInput(),randomInput()) 
.map(([first,second])=>first||second).subscribe(console.log)