如何延迟旁听者?

时间:2019-09-02 08:37:07

标签: angular angular7 angular8

我有被条件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 });
}

即使在发送发射后以及构建组件时如何捕获?

我更改了以下行:

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

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

2 个答案:

答案 0 :(得分:2)

您的问题是您发出均匀的声音,然后在该流上收听。但是当然,该事件在订阅者开始收听之前就已发出,因此您在这里将不会获得任何价值。

您可以使用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会向每个在值发出后进行订阅的新订户发送此事件。

答案 1 :(得分:1)

您应该使用delay

如下:

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

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