RxJS подписка не срабатывает - PullRequest
3 голосов
/ 06 июня 2019

В настоящее время изучаю RxJS. У меня есть целое число selectedCourseIndex внутри службы, на которое я бы хотел подписать отдельный компонент.

курсы-section.service.ts

private selectedCourseIndex: number = -1; //this number can change from another method
private selectedCourseIndexUpdated = new Subject<number>();

getSelectedCourseUpdateListener(){
    return this.selectedCourseIndexUpdated.asObservable();
}

курсы-section.component.ts

  private selectedCourseIndex: number = -1; //Placeholder initial selectedCourseIndex until new one given on init from courses-section service
  private selectedCourseSub: Subscription;

  constructor( public coursesSectionService: CoursesSectionService ){}

  ngOnInit(){
   this.selectedCourseIndex = 
   this.coursesSectionService.getSelectedCourseIndex();
   this.selectedCourseSub = this.coursesSectionService
    .getSelectedCourseUpdateListener()
    .subscribe((selectedCourseIndex: number) => {
      this.selectedCourseIndex = selectedCourseIndex;
      console.log('this fires when subscription updates'); //this never fires once
    });
  }

Однако подписка не срабатывает ни при первоначальной подписке, ни при изменении целого числа. Что не так?

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Наблюдаемая «Тема» не воспроизводит предыдущие значения при подписке.Ваша подписка будет срабатывать только в том случае, если вы выполните следующие действия в своем сервисе [каким-либо образом] -

this.selectedCourseIndexUpdated.next(<your new number>);

Чтобы активировать подписку при каждой подписке [для получения последнего выданного значения], вы должны использовать «BehaviorSubject» вместо Subject, например-

private selectedCourseIndexUpdated = new BehaviorSubject<number>(0);

BehaviorSubject воспроизводит последнее переданное значение в каждой подписке.Обратите внимание, что конструктор BehaviorSubject принимает значение по умолчанию.

1 голос
/ 06 июня 2019

Поправьте меня, если я ошибаюсь,

Ваша проблема: вам нужно текущее (или последнее) значение, которое имеет наблюдаемое, независимо от того, испустило ли кто-то значение прямо сейчас или нет.

Ответ: A Субъект или Наблюдаемый не имеет текущего значения.Когда значение излучается, оно передается подписчикам, и с ним делается наблюдаемое.Observable вступит в действие только тогда, когда в предметный поток будет отправлено другое значение.

Если вы хотите иметь текущее значение, используйте BehaviorSubject , который предназначен именно для той цели, которая вам нужна.сохраняет последнее переданное значение, независимо от того, когда оно было отправлено, и немедленно передает его новым подписчикам.

Примечание: у него также есть метод getValue () для получения текущего значения.


еще одна проблема, с которой вы столкнулись.

Проблема: ваш текущий код не работает.

Ответ: Позвольте мне привести пример того, как я работаю с Наблюдаемый -

Courses-action.service.ts

import { Injectable } from ‘@angular/core’;
import { Subject } from ‘rxjs’;

@Injectable()
Export class CoursesActionService {
  Public selectedCourseIndexUpdated = new Subject<any>();
  Public isCourseIndexUpdated$ = this.selectedCourseIndexUpdated.asObservable();

Public announceSelectedCourseIndex(response: any) {
  this.selectedCourseIndexUpdated.next(response);
}

Какой-то случайный файл, который выдает значение подписчику -

this.coursesActionService.announceSelectedCourseIndex(453);

Какой-то случайный файл, который прослушивает выбрасываемое значение -

this.coursesActionService.isCourseIndexUpdated$.pipe(takeUntil(this.destroyed$))
.subscribe(res => console.log(‘i have the response’, res));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...