【发布时间】:2021-09-01 06:10:12
【问题描述】:
我有一个服务,它从 2 个来源获取数据,然后对其执行一些逻辑,最重要的是,我有一个使用此服务的组件,并且应该在此逻辑完成时收到通知。我实际上有这方面的工作示例,但是我不完全确定我的订阅是否已关闭。
首先,服务代码:
@Injectable()
export class AppService {
private myData: string[] = [];
load(): Observable<any> {
return combineLatest([this.loadInternal1(), this.loadInternal2()]).pipe(
take(1),
tap(next => {
this.myData.push(next[0].map(el => el.toUpperCase()));
this.myData.push(next[1].map(el => el.toLowerCase()));
})
);
}
private loadInternal1(): Observable<string[]> {
return of(['data', 'data2']);
}
private loadInternal2(): Observable<string[]> {
return of(['data3', 'data4']);
}
}
然后是组件
export class HelloComponent {
loading: boolean = true;
constructor(private appService: AppService) {
const sub$ = this.appService.load().subscribe(next => {
console.log(next)
this.loading = false;
});
setTimeout(() => {
console.log(sub$.closed);
}, 1000);
}
}
据我所知,take(1) 应该在第一次发出值后自动关闭订阅,所以我不必手动关闭它。
我想检查一下,所以 1 秒后我确定是否是 sub$.closed === true,是的 - 是的。
但是,当我从我的服务实现中删除 take(1) 行时,它也被关闭了......所以我很困惑 - 我需要这个吗?或者我不明白订阅是如何工作的……?
#编辑:
此订阅不是在构造函数上发生,而是在点击时发生,如下所示:
@Component({
selector: 'hello',
template: `
<button (click)="getData()">Get data</button>
`
})
export class HelloComponent implements OnDestroy {
loading: boolean = true;
sub$: Subscription;
constructor(private appService: AppService) {}
ngOnDestroy(): void {
this.sub$.unsubscribe();
}
getData(): void {
this.sub$ = this.appService.load().subscribe(() => {
this.loading = false;
});
}
}
问题是 - private sub$ 在每次点击时发生了什么?它被重新分配,对吗?所以这意味着它也会自动完成?
如果用户点击 10 次,那么他将创建 10 个订阅,其中 9 个将被关闭。那么,以关闭页面为例,ngOnDestroy 将被触发并关闭第 10 个页面?
【问题讨论】:
标签: angular typescript rxjs