【问题标题】:use RXJS to unsubscribe when a Subject emits specific value当 Subject 发出特定值时,使用 RXJS 取消订阅
【发布时间】:2020-08-12 05:37:50
【问题描述】:

我认为我应该将 RXJS 用于特定的用例。用例是我有一个订阅,我想一直到其他地方的主题发出某个值为止。

例如:

// The sub to unsub when a certain <value> is emitted from a Subject elsewhere.
this.someObservable.subscribe(() => ...)


// Somewhere in the code far, far away, this should kill the subscription(s) that cares about <value>
this.kill.next(<value>)

我处理这个问题的方法是缓存订阅,然后在调用this.kill.next(&lt;value&gt;) 和相关的&lt;value&gt; 时取消订阅。不过,这是命令式的方法,感觉可以通过takeWhile 或其他类似技术做得更好。也许我可能需要将someObservablekill 主题合并?

如何利用 RXJS 来处理这个问题?

【问题讨论】:

  • 所有选项似乎都是可行的。选择对您和您的团队来说最直接的方法。
  • 听起来就像takeUntil(this.kill.pipe(map(/* ... */))
  • @martin map 里面有什么?类似:map((val) =&gt; val === &lt;valueOfInterest&gt;)?
  • Ups,我的意思不是 filter() 不是 map()

标签: rxjs


【解决方案1】:

takeUntil 是你想要的运算符

this.someObservable.pipe(
  takeUntil(this.kill.pipe(filter(val => val === killValue)))
).subscribe(() => ...)

一旦 kill observable 发出 killValue ,它将通过过滤器并发出到取消订阅流的 takeUntil。

const { timer, fromEvent, Subject } = rxjs;

const { takeUntil, filter } = rxjs.operators;

const kill$ = new Subject();

kill$.subscribe(val => {
  console.log(val);
});

timer(500, 500).pipe(
  takeUntil(kill$.pipe(filter(val => val === 'kill')))
).subscribe(val => {
  console.log(val);
});

document.getElementById('rnd').addEventListener('click', () => {
  kill$.next(Math.random());
});

document.getElementById('kill').addEventListener('click', () => {
  kill$.next('kill');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.2/rxjs.umd.min.js"></script>
<button id="rnd">Emit random</button>
<button id="kill">Emit kill</button>

【讨论】:

  • 我突然想到要比较的两个值在发出之前是未知的。因此,使用答案的顶部,killValue 将是未知的并由kill$ 发出,而someObservable(在答案的顶部看到)发出一个必须与killValue 进行比较的值.我不确定如何访问this.kill.pipe 中的killValue。还假设valsomeObservable 发出的值,对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多