как отписаться на заметку - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть угловое приложение, где я читаю файл и обрабатываю его, и эта обработка является частью наблюдаемой. У меня есть сервис, который возвращает наблюдаемый 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
}

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Это хороший подход с использованием 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();
}
0 голосов
/ 28 апреля 2018

Вы должны отписаться от подписки, а не от наблюдаемого:

processItems() {
    const ngbusy = this.myservice.observable.subscribe(items => {
        // perform some business logic 


        // unsubscribe at some point...
        ngbusy.unsubscribe();
    });

    // this will unsubscribe immediately...
    ngbusy.unsubscribe();

}
...