Angular 订阅可观察对象时如何获取最后一个值?

Angular 订阅可观察对象时如何获取最后一个值?,angular,typescript,rxjs,observable,Angular,Typescript,Rxjs,Observable,我有两个Angular2组件需要通过服务共享数据: @Injectable() 导出类搜索服务{ private searchResultSource=新主题() searchResult$=this.searchResultSource.asObservable() setSearchResults(_searchResult:string):无效{ this.searchResultSource.next(\u searchResult) } } 假设呈现了ComponentA,它通过Se

我有两个Angular2组件需要通过服务共享数据:

@Injectable()
导出类搜索服务{
private searchResultSource=新主题()
searchResult$=this.searchResultSource.asObservable()
setSearchResults(_searchResult:string):无效{
this.searchResultSource.next(\u searchResult)
}
}
假设呈现了
ComponentA
,它通过
SearchService.setSearchResults
发出一个事件。然后用户导航到
组件b
,该组件还订阅
搜索结果$
。但是,
ComponentB
将永远不会观察到
ComponentA
发出的事件,因为它在
ComponentA
发出事件时未订阅
searchResult$
,因为它不存在

如何创建一个可观察的
,向每个新订户发送最后一个事件?

您可以使用始终获取观察者的最后一个值,如下所示:

@Injectable()
导出类搜索服务{
private searchResultSource=新的ReplaySubject(1);
setSearchResults(_searchResult:string):无效{
this.searchResultSource.next(\u searchResult);
}
}
然后像往常一样订阅。

在这里可以找到更高级的方法:

行为主体
立即向新订阅者发送最后一个值:

@Injectable()
导出类搜索服务{
private searchResultSource=新行为主体(“”);
setSearchResults(_searchResult:string):无效{
this.searchResultSource.next(\u searchResult);
}
}

ReplaySubject
向新订户发送所有以前的事件。

您能解释一下“按正常方式订阅”吗?有没有订阅不起作用的情况?我的意思是我不需要展示你是如何订阅这个ReplaySubject的,因为你不需要在订阅端做任何特殊的事情,只要订阅,你就会得到最后一个值。好吧,酷。我遇到过这样的情况,
BehaviorSubject
subscription不起作用,但
ReplaySubject
起作用。我试图理解为什么。我对Rx的东西和可观测的东西还是很陌生(我们不是都在这一点上吗?!),但这个答案对我帮助很大。对于我这样的人。。。我最初选择了一个
ReplaySubject
(与
BehaviorSubject
相反),因为您不需要用值初始化
ReplaySubject
。但是默认情况下,订阅
ReplaySubject
observable会提供在其生命周期内广播的所有值。用缓冲区大小为1初始化
ReplaySubject
,就像在@tibbus answer中一样,这对我很有效!在这里可以找到一篇解释
AsyncSubject
Behavior Subject
ReplaySubject
的可理解且最新的文章:我发现这是一篇关于三个主题的清晰简单(无角度/TS)的解释,这三个主题都有实时代码可玩,而且从rxjs 6开始,还有shareReply操作符,请参见此处的评论,这里的医生