在Angular2中,'rxjs/Subject'是什么?

9

我正在通过官方食谱学习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);
  }
}

2
https://github.com/Reactive-Extensions/RxJS - zerkms
我意识到这是一个两年前关闭的帖子,但以防其他人也来到这里:missionAnnounced$ = this.missionAnnouncedSource.asObservable(); 这一行实际上是 MissionService 类的属性声明和初始化;与 missionConfirmed$ 行及其上面的两行私有行相同。 - Nagi
2个回答

21

Observable 只允许进行订阅,而 Subject 则允许发布和订阅(一个 subject 是一个 observable)。因此使用 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

下面这段代码的逻辑是什么?

订阅者订阅可观察对象(即以 $ 结尾的变量),而发布者调用 announceMissionconfirmMission。所有订阅 missionAnnounced$missionConfirmed$ 的观察者分别会收到这些事件。


4
为了补充之前的回答,您可以在以下SO链接中找到详细信息:什么是不同RxJS主题的语义? 简而言之,Rxjs主题实现了ObservableObserver接口(有关不同风味和行为的更多详细信息,请参见链接)。这里使用的标准主题作为管道,并将其在Observer界面上接收到的所有值通过其Observable接口传递。您在代码中看到的asObservable函数调用隐藏了Observer接口的实现,因此当您不打算使用它时,您不会意外地使用它,即您只能像使用任何常规observable一样使用此主题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接