如何解决当主题发出特定值时,使用RXJS取消订阅
我认为我应该针对特定用例使用RXJS。用例是我有一个要一直居住的订阅,直到其他地方的Subject发出某个值为止。
例如:
// 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(<value>)
的{{1}}时取消订阅。不过,这是当务之急,感觉可以通过<value>
或其他类似技术来更好地完成。也许我可能需要将takeWhile
与someObservable
主题合并?
我如何利用RXJS来解决这个问题?
解决方法
takeUntil是您想要的运算符
this.someObservable.pipe(
takeUntil(this.kill.pipe(filter(val => val === killValue)))
).subscribe(() => ...)
kill观察对象一旦发出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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。