Что такое "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
, поэтому вы не можете непреднамеренно использовать его, когда вас тоже не предполагают, т.е. Вы можете использовать этот объект только при использовании любого обычного наблюдаемого объекта.