#angular #rxjs #subject-observer
#angular #rxjs #субъект-наблюдатель
Вопрос:
У меня в моем сервисе Angular есть тема, подобная этой:
private sub = new Subject();
sendSub(page: page) {
this.sub.next(page);
}
getSub(): Observable<any> {
return this.sub.asObservable();
}
В моем родительском компоненте я подписался getSub()
. Из моего дочернего компонента я отправляю одно следующее значение, но в родительском я получаю два значения в подписке.
Нужно только одно значение, чтобы мой блок кода выполнялся только один раз:
subscription: Subscription;
this.subscription = this.pageService
.getSub()
.subscribe(
(data) => {
this.data = data;
this.nextSelection();
}
);
Комментарии:
1. Куда вы звоните
this.pageService.getSub().subscribe()
? Предоставьте некоторый контекст.2. @fridoo Вызов находится в блоке родительского конструктора
3. Ваш родительский компонент может быть создан дважды. Поместите a
console.log
в конструктор, чтобы проверить, выполняется ли он дважды.4. getSub() вызывается в приложении только один раз, и это единственный экземпляр, который использует данные субъекта. @fridoo
5. Что ж, если обратный вызов subscribe next выполняется дважды, для этого могут быть две причины. Либо вы подписываетесь один раз, и тема отправляется дважды, либо вы подписываетесь дважды, и тема отправляется один раз. Вы когда-нибудь отказывались от подписки?
Ответ №1:
Изменить
getSub(): Observable<any> {
return this.sub.asObservable();
}
Для
getSub: Observable<any> = this.sub.asObservable();
Это гарантирует, что каждый подписчик использует одну и ту же тему.
Комментарии:
1. Спасибо. Я попробовал этот подход, и результат тот же. просто информация в приведенных выше комментариях У меня есть только один потребитель, но настройка значения выполняется из нескольких мест, но только один в любой точке
Ответ №2:
Добавьте код подписки в конструктор родительского компонента.Вот такая же скрипка
this.appService
.getSub()
.subscribe(
(data) => {
this.data = data;
this.nextSelection();
}
);
Комментарии:
1. спасибо за ответ. В моем коде не так много различий, и предлагается, поскольку подписка в моем коде позволяет мне легко отказаться от подписки на вызовы.