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

  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, и результат тот же.

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

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

0
CruelEngine 12 Апр 2019 в 08:58

2 ответа

Лучший ответ

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

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

Таким образом, вы не увидите никакого вывода на консоль, потому что timer() излучает асинхронно, и вы фактически отмените подписку, прежде чем он вообще что-либо выдаст. Оператор startWith, напротив, выдает сразу при подписке.

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

2
martin 12 Апр 2019 в 06:16

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

добавить (teardown: TeardownLogic): подписка

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

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

1
Bunyamin Coskuner 12 Апр 2019 в 06:07