如何延迟监听观察者?

How to delay listen observer?

我有条件激活的组件 show:

<app-list *ngIf="show"></app-list>

在我激活这个组件的地方我也发出了事件:

this.tabsEvens.emitMoveToVersions(version);
this.router.navigate(["dictionary/versions/" + dict + '/' + code]);

问题是,我无法订阅组件 app-list 中的这个事件,因为它还没有创建,所以这不起作用:

ngInit(){
   this._moveToVersionSub = this.tabEvents
    .listenMoveToVersions()
    .subscribe((parameters: any) => { // can not get parameters here });
}

如何在发送 emit 之后和构建组件时捕获?

我更改了这行:

this.router.navigate(["dictionary/versions/" + dict + '/' + code]);
this.tabsEvens.emitMoveToVersions(version);

它起作用了,首先它通过路由参数激活组件,然后发出事件

你的问题是你发出一个偶数,然后在那个流上收听。但是当然事件在订阅者开始监听之前已经发出,所以你不会在这里得到任何值。

您可以使用 BehaviorSubject 而不是普通的 Subject。 BehaviorSubject 始终向每个新订阅者发出最后一个值,即使事件是在订阅者开始侦听之前发出的。

在我看来,通常延迟事件以使每个组件都有机会开始监听事件流并不是一个好主意。因为您开始猜测资源何时完成初始化。但是,当某些事情减慢了初始化进度时,它可能会破坏一切,最好寻求一个干净的解决方案。

编辑示例:

tabEvents: Subject<any> = new Subject();

tabEvents.next('someevent')

this._moveToVersionSub = this.tabEvents
.listenMoveToVersions()
.subscribe((parameters: any) => { // nothing will happen here });

与 BehaviorSubject 相同的示例

tabEvents: BehaviorSubject<any> = new BehaviorSubject();

tabEvents.next('someevent')

this._moveToVersionSub = this.tabEvents
.listenMoveToVersions()
.subscribe((parameters: any) => { // parameters = 'someevent });

这两种解决方案的实现没有区别。唯一的区别是,对于 BehaviorSubject,订阅将被 'someevent' 触发,因为 BehaviorSubject 会向每个在值发出后订阅的新订阅者发出此事件。

你应该使用 delay

如下:

example.pipe(
delay(2000)
subscribe( ...)
)

您可以了解更多:https://www.learnrxjs.io/operators/utility/delay.html