¿Qué es 'rxjs / Subject' en Angular2?

Estoy aprendiendo Angular2 por este libro de cocina oficial .

El siguiente código simplemente aparece de repente. ¿Por qué "missionAnnounced $" no tiene una statement de variable? let missionAnnounced $ = … ¿Cuál es la lógica del código siguiente?

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

Un Observable solo permite la suscripción, mientras que un Subject permite publicar y suscribirse (un sujeto es observable). Por lo tanto, al usar un Subject su service se puede utilizar como editor y suscriptor.

 @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)) } } 

Ahora todos los que quieran suscribirse al evento anunciado por la misión pueden suscribirse. El ComponentOne será el que emita el evento anunciado por la misión.

¿Por qué "missionAnnounced $" no tiene una statement de variable?

Lo hace. missionAnnounced$ es el nombre de la variable, al que se le asigna el Subject en su forma observable. Las variables miembro de class no usan let

¿Cuál es la lógica del código a continuación?

Los suscriptores se suscriben a los observables (las variables $ ), mientras que los editores llaman a announceMission y confirmMission . Todos los suscriptores a missionAnnounced$ y missionConfirmed$ , respectivamente, recibirán esos events.

Para complementar la respuesta anterior, encontrará amplios detalles en el siguiente enlace SO: ¿Cuál es la semántica de diferentes sujetos RxJS?

En resumen, un sujeto Rxjs implementa las interfaces Observable y Observer (consulte el enlace para get más detalles sobre los diferentes sabores y comportamientos del tema). El sujeto estándar utilizado aquí actúa como una tubería, y pasa a través de su interfaz Observable todos los valores que recibe en su interfaz Observer . La asObservable function asObservable que ve en el código oculta la implementación de la interfaz Observer , por lo que no puede usarla inadvertidamente cuando no se supone que también, es decir, solo puede usar este sujeto como lo hace con cualquier observable regular.