如何从Subject中获取最后一个值?

16 浏览
0 Comments

如何从Subject中获取最后一个值?

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

@Injectable()

export class SearchService {

private searchResultSource = new Subject()

searchResult$ = this.searchResultSource.asObservable()

setSearchResults(_searchResult: string): void {

this.searchResultSource.next(_searchResult)

}

}

假设ComponentA被渲染并通过SearchService.setSearchResults发出了一个事件。然后用户导航到ComponentB,它也订阅了searchResult$。然而,ComponentB永远不会观察到ComponentA发出的事件,因为它在ComponentA发出事件的时候没有订阅searchResult$,因为它还不存在。

如何创建一个Observable,它会将最后一个事件发送给每个新的订阅者?

0
0 Comments

Subject是RxJS中的一种特殊类型,它既是可观察对象(Observable),又是观察者(Observer)。它可以用来多播一个值或事件,将它们发送给多个观察者。在Subject中,有两种常见的类型:BehaviorSubject和ReplaySubject。

BehaviorSubject是一种特殊的Subject,它会立即向新的订阅者发送最后一个值。在上面的代码中,SearchService类使用了一个BehaviorSubject来存储搜索结果。每当调用setSearchResults方法时,该方法会通过调用searchResultSource.next方法将搜索结果发送给所有订阅者。

而ReplaySubject则会将所有先前的事件发送给新的订阅者。它可以用来缓存事件,并在新的订阅者加入时将缓存的事件发送给它们。

所以,BehaviorSubject必须始终具有一个初始值,可以是null。这是因为当新的订阅者加入时,BehaviorSubject会立即向它们发送最后一个值。如果没有初始值,订阅者将会收到undefined。

解决方法是在创建BehaviorSubject时传入一个初始值,这样新的订阅者就会接收到初始值。在上面的代码中,初始值是一个空字符串。

总结一下,Subject是RxJS中的一种特殊类型,用于多播值或事件给多个观察者。BehaviorSubject是一种特殊的Subject,它会立即向新的订阅者发送最后一个值。解决方法是在创建BehaviorSubject时传入一个初始值。ReplaySubject则会将所有先前的事件发送给新的订阅者。

0