rxjs中是否有逻辑或类型运算符?

时间:2017-12-27 13:21:56

标签: angular rxjs logical-or

我有一个角度服务,我希望暴露一个可以作为逻辑'或'排序的observable。假设我有多个源序列可以提供onoff值。我需要在true任何时候输出on,并在所有值为false时返回off

示例:

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或类似的东西,然后将状态保持在外部上下文中,这样我就可以对任何事件运行更新。但后来我遇到了一个问题,'关闭'事件可能意味着'关闭',但只有当其他序列也“关闭”时,它才会变得棘手。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

你实际上是基本上自己给出了答案:

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

所以这有点好,但我的输入不同步,所以它并不总是完美的。

说实话,我不明白你的意思。你在问题中明确表示你想要这个:

  

任何时候都需要输出true。

因此,如果输入在两者之间有一些时间延迟而改变,那么您将具有中间结果状态。这与你的问题完全一致。

如果您想以某种方式等待所有输入更改,因为它们可能会在同一时间更改,您可以向其添加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"

你当然可以将两者结合起来。