如何通过RxJS 6制作SR锁存器?

时间:2018-07-07 20:16:41

标签: javascript rxjs rxjs6

我想通过RxJS制作SR锁存器。它应该采用2个流(#1和#2),并且仅在#1发出某种东西时才发出。

然后它应该忽略#1并听#2直到发出一些东西。然后,它应该“重置”(编辑:表示停止发出可观察的数据,但保留订阅)并开始收听#1。

我做了一个快速的jsfiddle:https://jsfiddle.net/fczjusqn/11/的错误-如果您多次按start,它将使间隔启动多次。

这是在我的真实应用中模拟具有某些复杂设置逻辑的可暂停过程。

强制性代码:

// const start$ = ...
// const stop$ = ...

start$.pipe(
  flatMap(() => {
    // some setup logic...
    // ...creating another stream...
    // ...still setting up...
    return Rx.interval(1000)
      .pipe(
        takeUntil(stop$)
      )
    })    
  ).subscribe(() => console.log('interval'))

1 个答案:

答案 0 :(得分:1)

我建议创建一个input$可观察对象,该对象仅从开始到停止或从停止到开始都触发更改的值:

const start$ = Rx.fromEvent(document.querySelector('#start'), 'click').pipe(op.mapTo(true));

const stop$ = Rx.fromEvent(document.querySelector('#stop'), 'click').pipe(op.mapTo(false));

const input$ = Rx.merge(start$, stop$).pipe(op.distinctUntilChanged());

这样,当您多次单击启动或停止时,将被忽略。使用此可观察的对象,您可以像使用流一样简单地使用它。

Here is a fork of your example with my suggestion.