Angular2中的'rxjs/Subject'是什么?

Nic*_*.Xu 10 javascript rxjs angular

我正在通过这本官方食谱学习Angular2 .

以下代码突然出现.为什么"missionAnnounced $"没有变量声明?让missionAnnounced $ = ...下面代码的逻辑是什么?

import { Injectable } from '@angular/core';
import { Subject }    from 'rxjs/Subject';
@Injectable()
export class MissionService {
  // Observable string sources
  private missionAnnouncedSource = new Subject<string>();
  private missionConfirmedSource = new Subject<string>();
  // Observable string streams
  missionAnnounced$ = this.missionAnnouncedSource.asObservable();
  missionConfirmed$ = this.missionConfirmedSource.asObservable();
  // Service message commands
  announceMission(mission: string) {
    this.missionAnnouncedSource.next(mission);
  }
  confirmMission(astronaut: string) {
    this.missionConfirmedSource.next(astronaut);
  }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*tha 21

一个Observable只允许用于订阅,而Subject允许两者发布和订阅(受试者可观察到的).因此,使用a Subject可以将您的服务用作发布者订阅者.

@Component({})
class ComponentOne {
  constructor(private service: MissionService) {}

  onClick() {
    service.announceMission('mission started');
  }
}

@Component({})
class ComponentTwo {
  constructor(private service: MissionService) {
    service.missionAnnounced$.subscribe(mission => console.log(mission))
  }
}

@Component({})
class ComponentThree {
  constructor(private service: MissionService) {
    service.missionAnnounced$.subscribe(mission => console.log(mission))
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,每个想要订阅宣布任务的人都可以订阅.该ComponentOne会是一个发射任务宣布事件.

为什么"missionAnnounced $"没有变量声明?

确实如此.missionAnnounced$是变量名称,Subject以其可观察的形式分配.类成员变量不使用let

以下代码的逻辑是什么?

订阅者订阅了observable($变量),而发布者调用了announceMissionconfirmMission.所有订阅者missionAnnounced$missionConfirmed$分别将收到这些活动.