如何使用RxJS控制按钮行为?

时间:2015-11-16 05:14:19

标签: javascript rxjs

假设我有一个按钮和一个流,它是多个流的组合,如下所示:

let button = Rx.Observable.fromEvent($('#button'), 'click')
let source = Rx.Observable.combineLatest(multiple_source, (...val) => val)

我想要以下行动:

  • 点击button
  • 它将产生source
  • 的最新值
  • 当某些输入更改为下一次source事件时,阻止click继续产生价值
  • 再次点击buttonsource再次产生最新结果
  • 依旧......

我尝试了以下但未成功:

// `source` keep yielding values after button is clicked
button.flatMap( () => source).subscribe(val => do sth...) 

// `source` only yield values once but not yielding values 
// when some input changes
button.flatMap( () => source.take(1)).subscribe(val => do sth...) 

// `source` only yield values when button is clicked. 
// But like the above case, it stop yielding values 
// when some input changes
source.takeUntil(button).subscribe(val => do sth...) 

1 个答案:

答案 0 :(得分:2)

我发现在这种情况下工作的是Observable#withLatestFrom。我不确定这是不是最好的方法,如果有一个更简单的方法会更好。这是我经常使用的工具。

在您的示例中,您可以执行以下操作:

button.withLatestFrom(source, (_, src) => src).subscribe(doSomething)

我只是删除按钮事件,因为在示例中您似乎并不关心它。

这是一个很好的措施。希望这与你想要的类似:https://jsfiddle.net/pkoq9n6b/