我有以下组件:
@Component({...})
export class AppComponent implements OnInit, OnDestroy {
destroy$ = new Subject();
update$ = new Subject();
result: Result;
constructor(service: Service) {
}
ngOnInit() {
update$.pipe(
takeUntil(this.destroy$),
switchMap(() => this.service.get())
).subscribe(result => this.result = result);
this.refresh();
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
refresh() {
this.update$.next();
}
}
这种方法正确吗?还是应该在takeUntil(this.destroy$)
之后致电switchMap
?
update$.pipe(
switchMap(() => this.service.get()),
takeUntil(this.destroy$)
).subscribe(result => this.result = result);
还是我应该打两次?
update$.pipe(
takeUntil(this.destroy$),
switchMap(() => this.service.get()),
takeUntil(this.destroy$)
).subscribe(result => this.result = result);
答案 0 :(得分:4)
最干净的方法是在takeUntil
之后调用switchMap
。
update$.pipe(
switchMap(() => this.service.get()),
takeUntil(this.destroy$)
).subscribe(result => this.result = result);
这将防止订阅产生任何排放。如果您之前添加了takeUntil
,则switchMap
订阅将发出值,直到project
函数返回的可观察值完成为止,这可能永远不会发生(取决于您的服务代码)。
在takeUntil
之前和之后都不需要调用switchMap
,因为switchMap
本身可以取消订阅时,可以从源中取消订阅(switchMap
之前的所有内容)来自。
答案 1 :(得分:0)
通常,您希望takeUntil
应该是最后一个运算符。在您的情况下,这是正确的方法:
update$.pipe(
switchMap(() => this.service.get()),
takeUntil(this.destroy$)
).subscribe(result => this.result = result);