假设我有这个可观察的:
public settings$: Observable<
SettingsResponse
> = this._service.getSettings();
Run Code Online (Sandbox Code Playgroud)
然后我有:
public ngOnInit(): void {
window.customService.init();
}
Run Code Online (Sandbox Code Playgroud)
因为 init 在 observable 完成之前触发,除了 setTimeout 或订阅 observable 并在触发之前使用非异步属性在模板中设置设置之外,是否还有其他方法可以延迟window.customService.init()?
您可以利用可观察对象,并使用共享,以便对多个async管道仅执行一个选项卡。
public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
tap(()=> this.init()),
share()
);
public init() {
if (!this.initFlag) {
window.customService.init();
this.initFlag = true;
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用扫描运算符,而不必跟踪该函数是否已被调用。
public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
scan((acc, next)=> (acc === "first" && this.init(), next), "first"),
share()
);
public init() {
window.customService.init();
}
Run Code Online (Sandbox Code Playgroud)
如果您只需要第一个发出的值,那么我会使用Finalize运算符。我认为它仍然会火async,但我从未尝试过。
public settings$: Observable<SettingsResponse> = this._service.getSettings().pipe(
first(),
finalize(() => window.customService.init()),
shareReplay(1)
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2857 次 |
| 最近记录: |