#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): подписка
Добавляет разрыв, который будет вызываться во время отмены подписки () этой подписки.
Для получения дополнительной информации ознакомьтесь с документами