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

#angular #rxjs #rxjs6

#angular #rxjs #rxjs6

Вопрос:

Я столкнулся с проблемой. Не уверен, работает ли он так, как ожидалось.

   startTimerSubscription(){
    this.timerSubscription.unsubscribe();
    let subscription = this._testService.getTimerData().subscribe((response) => {
      console.log(response);
    });
    this.timerSubscription.add(subscription);
  }
  

Всякий раз, когда я вызываю функцию, данные никогда не подписываются. т.е. Данные не выводятся на консоль.

моя тестовая служба getTimerData() определила как:

 getTimerData(){
    return timer(0,10000).pipe(switchMap(()=> {
      return of(this.testData);
    }));
  }
  

Может кто-нибудь объяснить мне это поведение? Я отменяю подписку на данные перед их подпиской. Разве данные не должны регистрироваться каждые 10 секунд?

Я попытался использовать interval operator, и результат тот же.

Я также создал пример stackblitz

Заранее спасибо

Комментарии:

1. почему понижающий голос? разве это не правильный вопрос? если это дубликат, пожалуйста, помогите мне, разместив ссылку

Ответ №1:

Проблема в том, что вы вызываете .unsubscribe() перед добавлением какой-либо подписки .add() .

При вызове .unsubscribe() он помечает объект подписки как «закрытый», а при попытке добавления любой другой подписки он также отменяет подписку, поскольку «родительская» подписка уже «закрыта».

Таким образом, вы не увидите никаких выходных данных консоли, потому timer() что они генерируются асинхронно, и вы фактически отписываетесь до того, как они что-либо выдадут. В отличие от этого, startWith operator выдает сразу после подписки.

Это конкретные строки

Ответ №2:

Вы не используете add подписку для себя. Вот рабочее решение

Вместо использования add метода я просто назначаю подписки членам вашего класса.

 this.timerSubscription.unsubscribe();
this.timerSubscription = this._testService.getTimerData().subscribe((response) => {
  console.log(response);
});

------

this.intervalSubscription.unsubscribe();
this.intervalSubscription = this._testService.getIntervalData().subscribe((response) => {
  console.log(response);
});
  

add метод получает TearDownLogic , который будет использоваться при уничтожении подписки. Например, у вас могут быть другие Subscription файлы, которые нужно уничтожить с помощью этого, поэтому вы можете добавить его.

добавить (демонтаж: TeardownLogic): подписка

Добавляет разрыв, который будет вызываться во время отмены подписки () этой подписки.

Для получения дополнительной информации ознакомьтесь с документами