Skip to content

subject进行asObservable转换是否必要 #64

@alanhe421

Description

@alanhe421

ng官网在讲组件通讯时,给出了3种方案,第三种是利用rxjs的观察订阅模式。其中有如下代码块

import { Injectable } from '@angular/core';
import { Subject }    from 'rxjs';
 
@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);
  }
}

我们注意到在创建subject对象后利用asObservable进行了转换,查看源码,返回类型为observable。但是要知道subject本身就是一类特殊的observable,兼具observable和observer的性质,本身也可以订阅。
如下这样是可以的。
image

这里的asObservable转换还有必要吗?

看Subject实现细节,我们会明白它多了closed等一些信息,而这些observable是没有的。所以只有当我们需要隐藏内部实现细节,只关心改变的值时,我们就需要这个转换。但是比如我们利用subject了解这个订阅关闭没关闭等,这就需要subject才可以了。
image

其实这个疑问在网上也有类似的讨论,戳这里

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions