当主题发出特定值时,使用RXJS取消订阅

当主题发出特定值时,使用RXJS取消订阅,rxjs,Rxjs,我认为我应该为一个特定的用例利用RXJS。使用案例是,我有一个订阅,我希望它一直存在,直到某个特定的值从其他地方的主题发出为止 例如: //当某个主题从其他地方发出特定信息时,sub将被取消。 this.someObservable.subscribe(()=>…) //在代码的某个地方,在很远很远的地方,这应该会杀死那些关心它的订阅 this.kill.next() 我的处理方法是缓存订阅,然后在调用相关的时取消订阅。不过,这是一种必要的方法,而且感觉通过takeWhile或其他类似技术可以

我认为我应该为一个特定的用例利用RXJS。使用案例是,我有一个订阅,我希望它一直存在,直到某个特定的值从其他地方的主题发出为止

例如:

//当某个主题从其他地方发出特定信息时,sub将被取消。
this.someObservable.subscribe(()=>…)
//在代码的某个地方,在很远很远的地方,这应该会杀死那些关心它的订阅
this.kill.next()
我的处理方法是缓存订阅,然后在调用相关的
时取消订阅。不过,这是一种必要的方法,而且感觉通过
takeWhile
或其他类似技术可以做得更好。也许我需要将
someObservable
kill
主题合并


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

takeUntil是您想要的操作员

this.someObservable.pipe(
  takeUntil(this.kill.pipe(filter(val => val === killValue)))
).subscribe(() => ...)
一旦kill observable发出killValue,它将通过过滤器并发送到Take,直到Take取消订阅流

const{timer,fromEvent,Subject}=rxjs;
const{takeUntil,filter}=rxjs.operators;
const kill$=新主题();
kill$.subscribe(val=>{
控制台日志(val);
});
计时器(500500)。管道(
takeUntil(kill$.pipe(过滤器(val=>val=='kill'))
).订阅(val=>{
控制台日志(val);
});
document.getElementById('rnd')。addEventListener('click',()=>{
杀死$.next(Math.random());
});
document.getElementById('kill').addEventListener('click',()=>{
kill$.next('kill');
});

随机发射

发射杀伤
所有选项似乎都可行。使用对您和您的团队来说最简单的方法。听起来就像是takeUntil(this.kill.pipe(map(/*…*/)
@martin
map
)中的内容。类似于:
map((val)=>val==)
Ups,我是说不是
filter()
而不是
map()
。我突然想到,要比较的两个值在发出之前是未知的。因此,使用答案的上半部分,
killValue
将是未知的,并由
kill$
发出,
一些可观察的
(见答案的上半部分)发出的值必须与
killValue
进行比较。我不确定如何在
this.kill.pipe
中访问
killValue
。还假设
val
是从
某个可观察的
发出的值,对吗?
this.someObservable.pipe(
  takeUntil(this.kill.pipe(filter(val => val === killValue)))
).subscribe(() => ...)