Javascript 如何通过RxJS 6制作SR闩锁?

Javascript 如何通过RxJS 6制作SR闩锁?,javascript,rxjs,rxjs6,Javascript,Rxjs,Rxjs6,我想通过RxJS制作SR闩锁。它应该有两个流(#1和#2),并且只有当#1发出某种东西时才发出 然后它应该忽略#1,然后听#2,直到它发出一些东西。然后它应该“重置”(编辑:意味着停止发射观测值,但保留订阅)并开始监听#1 我做了一个快速的JSFIDLE:有了这个bug-如果你按几次start,它会使interval启动几次 这是在我的真实应用程序中模拟带有一点复杂设置逻辑的可暂停过程 强制性守则: // const start$ = ... // const stop$ = ... star

我想通过RxJS制作SR闩锁。它应该有两个流(#1和#2),并且只有当#1发出某种东西时才发出

然后它应该忽略#1,然后听#2,直到它发出一些东西。然后它应该“重置”(编辑:意味着停止发射观测值,但保留订阅)并开始监听#1

我做了一个快速的JSFIDLE:有了这个bug-如果你按几次start,它会使interval启动几次

这是在我的真实应用程序中模拟带有一点复杂设置逻辑的可暂停过程

强制性守则:

// 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'))

我建议创建一个
输入$
可观察对象,从开始到停止或从停止到开始只触发更改的值:

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());
这样,当您多次单击“开始”或“停止”时,它将被忽略。使用这个可观察对象,您可以简单地使用您已经在使用的流


你说的重置是指取消订阅并重新订阅吗?或者干脆忽略但保留订阅?@IngoBürk它应该保留订阅。我们的想法是隐藏这个实现细节并进一步传递obervable。刚刚尝试过,它可以工作,谢谢!非主题问题-为什么使用switchMap而不是flatMap?
switchMap
将中止以前的
Observable
并在每次值更改时将其替换为新的。在这种情况下,没有理由保持前面的
可见
,我使用了
开关映射
。以下是您的初始代码分支,它突出了
flatMap
的问题:(在开始时单击多次,您将以并行运行多个observables订阅结束)