как отписаться от наблюдаемой, которая делает switchMap - PullRequest
1 голос
/ 24 февраля 2020

вот следующий код, который позволяет мне сделать http-запрос к серверу, чтобы получить заданный статус среди нескольких возможных (объединение данных).

getIntervalStatus(sessionId: string): Observable<HttpResponse<string>> {
  return interval(1000).pipe(
    switchMap(value => {
      return this.getStatus(sessionId);
    }),
  );
}

Как я могу отписаться от наблюдаемого, возвращенного interval(1000)?

Когда я отписываюсь с подпиской getIntervalStatus.subscribe(), она не останавливает interval (1000), которая продолжает передачу. Смотрите пример ниже

this.getIntervalStatusSubscription = this.device.getIntervalStatus(this.printerVMService.getSessionId()).subscribe(
  status => {
    switch (this.status) {
      case 'opened':
        break;
      case 'payed':
        this.getIntervalStatusSubscription.unsubscribe();
        break;
      case 'closed':
        this.getIntervalStatusSubscription.unsubscribe();
        break;
      case 'used':
        this.getIntervalStatusSubscription.unsubscribe();
        break;
      default:
    }
  },

Ответы [ 3 ]

4 голосов
/ 24 февраля 2020

Как насчет использования takeWhile , чтобы сохранить соединение открытым, пока не будет выполнено определенное условие?

// this observable auto-unsubscribes when status not 'opened'
status$ = this.device.getIntervalStatus().pipe(
  takeWhile(status => status === 'opened')
);
2 голосов
/ 24 февраля 2020

В файле, в котором вы подписываетесь на эту наблюдаемую реализацию, выполните следующее: 1. Создайте переменную из типа BehaviorSubject, например

isDestroyed: BehaviorSubject<false>
Прежде чем подписаться на наблюдаемое использование, используйте оператор takeUntil из Rx JS и передайте тему вашего поведения, например:
takeUntil(this.isDestroyed)
Затем в onDestroy значение выброса жизненного цикла компонента:
this.isDestroyed.next(true)
1 голос
/ 24 февраля 2020

Я думаю, что проблема, с которой вы сталкиваетесь, возникает из-за вашего заявления switch. Вы используете this.status в своем заявлении switch вместо статуса вашего getIntervalStatus. Попробуйте:

this.getIntervalStatusSubscription = this.device.getIntervalStatus(this.printerVMService.getSessionId()).subscribe(
             status => {
              switch (status) {//use the status from the subscribe method
                case 'opened':
                  break;
                case 'payed':
                  this.getIntervalStatusSubscription.unsubscribe();
                  break;
                case 'closed':
                  this.getIntervalStatusSubscription.unsubscribe();
                  break;
                case 'used':
                  this.getIntervalStatusSubscription.unsubscribe();
                  break;
                default:
              }
            },

Вы также можете упростить метод подписки, вы хотите отменить подписку для каждого статуса, кроме 'opened'. Чтобы вы могли написать:

this.getIntervalStatusSubscription = this.device.getIntervalStatus(this.printerVMService.getSessionId()).subscribe(
             status => {
              if(status !== 'opened'){
                this.getIntervalStatusSubscription.unsubscribe();
              }
             }
            },
...