Что такое "rxjs/Subject" в Angular2?

Я изучаю Angular2 этой официальной кулинарной книгой .

Следующий код просто появляется внезапно. Почему "missionAnnounced $" не имеет объявления переменной? let 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);
  }
}

Ответ 1

An Observable разрешает подписку, а Subject позволяет публиковать и подписываться (субъект является наблюдаемым). Поэтому использование 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))
  }
}

Теперь каждый, кто хочет подписаться на объявленное мероприятие, может просто подписаться. ComponentOne будет выбрано событие, объявленное миссией.

Почему "missionAnnounced $" не имеет объявления переменной?

Это так. missionAnnounced$ - это имя переменной, которому присваивается Subject в ее наблюдаемой форме. Переменные члена класса не используют let

Какова логика приведенного ниже кода?

Подписчики подписываются на наблюдаемые (переменные $), а издатели называют announceMission и confirmMission. Все подписчики missionAnnounced$ и missionConfirmed$, соответственно, получат эти события.

Ответ 2

В дополнение к предыдущему ответу вы найдете подробную информацию в следующей SO-ссылке: В чем заключаются семантики разных объектов RxJS?

Короче говоря, субъект Rxjs реализует интерфейс Observable и Observer (см. ссылку для более подробной информации о различных вкусах и поведении субъекта). Используемый здесь стандартный объект действует как труба и передает через интерфейс Observable все значения, которые он получает на своем интерфейсе Observer. Вызов функции asObservable, который вы видите в коде, скрывает реализацию интерфейса Observer, поэтому вы не можете непреднамеренно использовать его, когда вас тоже не предполагают, т.е. Вы можете использовать этот объект только при использовании любого обычного наблюдаемого объекта.