RxJS仅从内部可观察到取消订阅
假设我有一个间隔,每一秒都会发出心跳。在每一次节拍中,我都想在我的网页上检查一些东西,并做出相应的反应。我还想选择取消订阅内部可观察操作,但要不断获取心跳,这样当我订阅回来时,一切都会像以前一样流动。 从Interval和piping创建订阅它不允许从内部操作取消订阅,只允许整个订阅。 有没有一种方法可以返回内部可观测值,这样我就可以取消订阅,同时仍然保留从间隔中创建的心跳 编辑:我试图创建一个类来描述我所说的内容:RxJS仅从内部可观察到取消订阅,rxjs,Rxjs,假设我有一个间隔,每一秒都会发出心跳。在每一次节拍中,我都想在我的网页上检查一些东西,并做出相应的反应。我还想选择取消订阅内部可观察操作,但要不断获取心跳,这样当我订阅回来时,一切都会像以前一样流动。 从Interval和piping创建订阅它不允许从内部操作取消订阅,只允许整个订阅。 有没有一种方法可以返回内部可观测值,这样我就可以取消订阅,同时仍然保留从间隔中创建的心跳 编辑:我试图创建一个类来描述我所说的内容: class Monitor { sub: Subscription |
class Monitor {
sub: Subscription | null = null;
start() {
this.sub = this.monitor().subscribe();
}
monitor() {
const dom$ = someSelectorObserver(this.win.document, '#someSelector').pipe(
mergeMap(newElementOrBail => {
if (newElementOrBail) {
return handle(newElementOrBail);
} else {
return bail();
}
}),
tap({
error: error => this.log.error(error),
}),
);
return dom$;
}
handle(ele: HTMLElement) {
// do stuff
}
bail() {
this.sub.unsubscribe();
}
}
因此,基本上,我的监视器从创建订阅开始,只要有一个新元素来处理一切就可以了,但是当出现一个bail信号时,我希望取消订阅,同时仍然监视DOM更改以返回以前的元素。
因此,外部订阅基本上是DOM观察者,内部订阅是mergeMap句柄函数。这更有意义吗 你可以对你的内在可观察性设置一些条件:
private takeSignal = true
interval(3000).pipe(switchMap(() => takeSignal ? inner$ : NEVER))
然后根据需要翻转信号
但似乎更容易从整个事件中取消订阅,并在需要时重新订阅。当你不使用时间间隔时,为什么要保持时间间隔?你可以对你的内在可观察性设置一些条件:
private takeSignal = true
interval(3000).pipe(switchMap(() => takeSignal ? inner$ : NEVER))
然后根据需要翻转信号
但似乎更容易从整个事件中取消订阅,并在需要时重新订阅。不使用时为什么要保持间隔?您可以将逻辑分成两个(或更多)流 将
heartbeat$
存储在单独的变量中,并出于不同的原因多次订阅
通过这种方式,您可以将逻辑拆分为不同的流,并单独控制订阅
const heartbeat$ = interval(3000);
const inspectWeb = heartbeat$.pipe(
// do stuff
).subscribe()
inspectWeb.unsubscribe()
heartbeat$.pipe(
// do other stuff
).subscribe()
您可以将逻辑分成两个(或更多)流 将
heartbeat$
存储在单独的变量中,并出于不同的原因多次订阅
通过这种方式,您可以将逻辑拆分为不同的流,并单独控制订阅
const heartbeat$ = interval(3000);
const inspectWeb = heartbeat$.pipe(
// do stuff
).subscribe()
inspectWeb.unsubscribe()
heartbeat$.pipe(
// do other stuff
).subscribe()
如果您需要间隔对依赖它的每个流始终在同一时间打勾,则可以使用
share
运算符:heartbeat$=interval(3000)。管道(share())
如果您需要间隔对依赖它的每个流始终在同一时间打勾,则可以使用share
运算符:heartbeat$=interval(3000).pipe(share())
interval是它的简化版本,源可观察到的是DOM的一系列更改-当某个更改发生时,我想取消订阅创建的内部可观察到的内容,当更改恢复时,重新创建订阅以保持数据流动。基本上没有源可观察到的内容(DOM元素订阅)我不知道开关是开着还是关着,就像你应该发布真实的问题,而不是itinterval的简化版本是它的简化版本,源可观察到的是对DOM的一系列更改-当某个更改发生时,我想取消订阅创建的内部可观察到的内容,并且当更改被恢复时订阅保持数据流动。基本上没有源可观察(DOM元素订阅),我不知道切换是打开还是关闭,就像你应该发布真实的问题,而不是它的简化版本