Как отписаться на заметку
У меня есть угловое приложение, где я читаю файл и обрабатываю его, и эта обработка является частью наблюдаемой. У меня есть сервис, который возвращает наблюдаемое an (ngbusy: подписка). Я подписываюсь на это заметное в моем компоненте. Наблюдаемое присваивается ngBusy, который отображает счетчик. Теперь спиннер продолжает вращаться даже после завершения подписки. Я знаю, что мы должны отказаться от подписки. Но когда я отменяю подписку в том же методе, где мы подписываемся, я даже не вижу отображаемый счетчик. Должны ли мы всегда использовать ngOndestroy, чтобы отписаться.
service.ts
const obsrv:Observable
obsrv= new Observable((observer) => {
// observable execution
observer.next(this.items)
observer.complete()
})
component.ts
processItems() {
ngbusy = this.myservice.observable.subscribe(items => {
//perform some business logic
});
this.myservice.observable.unsubscribe(); //not working here
}
1 ответ
Вы должны отписаться от подписки, а не от наблюдаемого:
processItems() {
const ngbusy = this.myservice.observable.subscribe(items => {
// perform some business logic
// unsubscribe at some point...
ngbusy.unsubscribe();
});
// this will unsubscribe immediately...
ngbusy.unsubscribe();
}
Это хороший подход с использованием takeuntil и ngUnsubscribe
private ngUnsubscribe: Subject = new Subject();
ngOnInit() {
this.myThingService.getThings()
.takeUntil(this.ngUnsubscribe)
.subscribe(things => console.log(things));
/* if using lettable operators in rxjs ^5.5.0
this.myThingService.getThings()
.pipe(takeUntil(this.ngUnsubscribe))
.subscribe(things => console.log(things));
*/
this.myThingService.getOtherThings()
.takeUntil(this.ngUnsubscribe)
.subscribe(things => console.log(things));
}
ngOnDestroy() {
this.ngUnsubscribe.next();
this.ngUnsubscribe.complete();
}