我有一个定义公共的 Angular 服务Subject
。稍后在某些情况下,服务将调用.next()
此主题。
另外,我有一个 Angular 组件,它在它的方法中.subscribe()
对这个 Subject 进行调用,并在它的方法ngOnInit()
中调用。.unsubscribe()
ngOnDestroy()
虽然服务和组件都还活着,但我的代码工作正常。但是,用户可以在我的应用程序中单击不同的选项卡。这导致我的组件卸载并调用其ngOnDestroy()
方法,这意味着 Observable 已取消订阅。
从这一点开始,组件不再存在,但服务仍然存在 - 其他组件仍在使用它。当.next()
组件调用后服务调用方法时.unsubscribe()
,抛出此错误ObjectUnsubscribedError。
ERROR Error: Uncaught (in promise): ObjectUnsubscribedError: object unsubscribed
此外,稍后如果用户返回到包含该组件的选项卡,ngOnInit()
则会执行 并且重新订阅此 observable 会再次引发相同的错误。
我做错了什么,我该如何解决这些错误?
import { Subject } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class StatusService {
public statusChange$: Subject<number>;
public constructor(...) {
this.statusChange$ = new Subject<number>();
}
public someInternalLogic(someNumber: number): void {
this.statusChange$.next(someNumber);
// this will throw an error if StatusComponent call .unsubscribe()
}
}
@Component({
selector: 'app-status',
templateUrl: './status.component.html',
styleUrls: ['./status.component.scss']
})
export class StatusComponent implements OnInit, OnDestroy {
public constructor(
private _statusService: StatusService) {}
public ngOnInit(): void {
this._statusService.statusChange$.subscribe(value => this._onStatusChange(value));
}
public ngOnDestroy(): void {
this._statusService.statusChange$.unsubscribe();
// after this point if the StatusService calling .next() an error will be thrown
}
private _onStatusChange(value: number): void {
// ....
}
}