как отказаться от подписки на наблюдаемый

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

person user1015388    schedule 27.04.2018    source источник


Ответы (2)


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

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


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

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

}
person Sébastien    schedule 27.04.2018
comment
@ Себастьян, спасибо. Думаю, я тоже пробовал отписаться от подписки. Позвольте мне попробовать еще раз. Можно ли это сделать тем же методом вскоре после завершения кода подписки. - person user1015388; 28.04.2018
comment
Вам следует отказаться от подписки в тот момент, когда она вам не нужна. Если он находится вне метода, присвойте подписку свойству класса вместо переменной. Таким образом, вы можете отказаться от подписки из любого места в классе. - person Sébastien; 28.04.2018
comment
У меня это не работает. Блесна не срабатывает. - person user1015388; 30.04.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();
}
person Deeksha Bilochi    schedule 22.12.2018