网上取消订阅的常见方法是下面这个,突发奇想:可以直接complete实现取消订阅吗?
private destroyed$ = new Subject();
ngOnInit() {
this.http.get('/api/data')
.pipe(takeUntil(this.destroyed$))
.subscribe(data => console.log(data));
}
ngOnDestroy() {
this.destroyed$.next();// 可以直接complete实现取消订阅吗?
this.destroyed$.complete();
} 不要this.destroyed$.next();
不建议直接使用
complete()
方法来取消订阅。因为complete()
方法只会告诉Observable
,不再有新的数据产生了,但是并不会立即停止正在进行的请求。而takeUntil()
操作符会在Subject
发出next()
信号时,立即停止正在进行的请求,因此更加可靠。如果直接使用complete()
方法,可能会导致请求继续进行,浪费资源,或者在某些情况下无法取消订阅。因此,建议还是使用takeUntil()
操作符来实现取消订阅。