RxJS订阅未触发

时间:2019-06-05 23:51:47

标签: angular rxjs

当前正在学习RxJS。我在服务中有一个整数selectedCourseIndex,我想订阅一个单独的组件。

courses-section.service.ts

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

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

courses-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 个答案:

答案 0 :(得分:2)

可观察到的“主题”不会在订阅时重播以前的值。仅当您在服务中执行以下操作时,您的订阅才会触发[以某种方式-

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

要在每个订阅上触发订阅(以获取最后发出的值),则应使用“ BehaviorSubject”而不是“ Subject”,例如-

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

BehaviorSubject重播每个订阅上最后发出的值。注意BehaviorSubject构造函数采用默认值。

答案 1 :(得分:1)

如果我错了,请纠正我,

您的问题:您想要一个可观察对象具有的当前(或最新)值,而不管某人是否立即发出了一个值。

答案: 主题可观察没有当前值。发出值时,它将传递给订阅者,并使用它来进行可观察的操作。仅当向主题流发出另一个值时,Observable才会起作用。

如果要使用当前值,请使用 BehaviorSubject (精确地满足您的需要),它会保留最后一个发出的值,而与发出它的时间无关,并立即将其传达给新的订阅者。

注意:它还具有方法 getValue()以获取当前值。


您面临的另一个问题。

问题:您当前的代码似乎无效。

答案: 让我举一个例子,说明我如何使用 Observable -

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));