RxJS仅从内部可观察到取消订阅

RxJS仅从内部可观察到取消订阅,rxjs,Rxjs,假设我有一个间隔,每一秒都会发出心跳。在每一次节拍中,我都想在我的网页上检查一些东西,并做出相应的反应。我还想选择取消订阅内部可观察操作,但要不断获取心跳,这样当我订阅回来时,一切都会像以前一样流动。 从Interval和piping创建订阅它不允许从内部操作取消订阅,只允许整个订阅。 有没有一种方法可以返回内部可观测值,这样我就可以取消订阅,同时仍然保留从间隔中创建的心跳 编辑:我试图创建一个类来描述我所说的内容: class Monitor { sub: Subscription |

假设我有一个间隔,每一秒都会发出心跳。在每一次节拍中,我都想在我的网页上检查一些东西,并做出相应的反应。我还想选择取消订阅内部可观察操作,但要不断获取心跳,这样当我订阅回来时,一切都会像以前一样流动。 从Interval和piping创建订阅它不允许从内部操作取消订阅,只允许整个订阅。 有没有一种方法可以返回内部可观测值,这样我就可以取消订阅,同时仍然保留从间隔中创建的心跳

编辑:我试图创建一个类来描述我所说的内容:

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元素订阅),我不知道切换是打开还是关闭,就像你应该发布真实的问题,而不是它的简化版本