rxjs - 在 BehaviorSubject 中更新 self 时如何避免无限循环?

标签 rxjs observable

声明如下:

  public panel$: BehaviorSubject<any> = new BehaviorSubject<any>(false);

像这样使用

  togglepanel() {
    this.panel$.subscribe(
      (x) => {
        if (x) {
          this.panel$.next(false);
        } else {
          this.panel$.next(true);
        }
      });
  }

它创造了一个试图更新 self 的无限循环。

最佳答案

您可以通过仅从 panel$ Observable 获取一个(最新)值来更新它:

this.panel$.take(1).subscribe(...)

但是最好对状态进行一些不同的建模,如下所示:

// const onToggle$ = new Rx.Subject();
var toggle$ = Rx.Observable.fromEvent(document, 'click');

const initialValue = true;
const state$ = toggle$
  .scan(state => !state, initialValue)
  .startWith(initialValue);
      
const htmlSubscription = state$.subscribe(state => {
  document.getElementById('toggle').innerText = 'toggle: ' + state;
});
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
<button id="toggle">loading...</button>

编辑:

这段代码的角度版本是:

  public toggle$ = new Subject();
  public state$ = this.toggle$.scan(state => !state, true)
                        .startWith(true)
                        .subscribe((x) => console.log('x:' + x));


  togglepanel() {
    this.toggle$.next(null);
  }

关于rxjs - 在 BehaviorSubject 中更新 self 时如何避免无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47606569/

相关文章:

node.js - 在 Observable 中返回自己的静态值

typescript - RXJS Observable doSomething onComplete

javascript - Rxjs 在顺序执行操作时出现 concat 运算符问题

javascript - 在 RxJS 中以 block 的形式运行一组可观察对象

javascript - 当没有编写 api 时,如何模拟 Angular2 中的 http observable

node.js - RxJS 结果与 switchMap 和 mergeMap

JavaFX observableList 作为 Map 中的值

angular - 取消订阅服务内部的 Observables?

angular - 返回模拟 http 响应而不是 angular4 中的服务器调用

rxjs - RxJS 5 中不存在“mergeDelayError”