RXJS中是否有逻辑或类型的操作员



我有一项角度服务,我想在其中揭示一个可观察到的,它是逻辑上的'或''或'。假设我有多个源序列可以给出onoff值。我需要在任何内容 on时输出true,然后在所有值均为off时返回false

示例:

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$),所以这有点还可以,但是我的输入不超出同步,因此并不总是完美的。我的意思是,第一个$可能会发出多个价值,而第二美元可能永远不会发射,而另一种情况则是。我还能做什么?

我已经想到了一些合并或类似的合并,然后将状态保存在外部上下文中,这样我就可以在任何事件上运行更新。但是后来我遇到了一个问题,"关闭"事件可能意味着"关闭",但是只有当其他序列也"关闭"时,因此很快就会变得棘手。

您实际上基本上给了答案:

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"

您当然可以将两者都结合在一起。

看看这是否是您要寻找的

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)

相关内容

  • 没有找到相关文章

最新更新