Angular 订阅一个主题并关闭该主题的HTTP调用
我有两个可以获取给定对象的服务:一个用于获取完整列表的初始HTTP调用,以及用于实时更新新元素的websocket通知 我想将这两个调用连接到同一个可观察对象,以便显示页面不知道后端 这是马德斯的电话:Angular 订阅一个主题并关闭该主题的HTTP调用,angular,rxjs,Angular,Rxjs,我有两个可以获取给定对象的服务:一个用于获取完整列表的初始HTTP调用,以及用于实时更新新元素的websocket通知 我想将这两个调用连接到同一个可观察对象,以便显示页面不知道后端 这是马德斯的电话: private getInitialData(subject: Subject<any>) { this._http.get<Array<any[]>>(`/call/to/backend`) .flatMap(items =>
private getInitialData(subject: Subject<any>) {
this._http.get<Array<any[]>>(`/call/to/backend`)
.flatMap(items => items)
.subscribe(subject);
}
private listenNewData(subject: Subject<any>) {
this.websocketService.listen('/some/ws/topic')
.subscribe(subject);
}
private initialize() {
const subject = new Subject<any>();
this.dataService.getInitialData(subject);
this.listenNewData(subject);
subject.subscribe(item => this.items.push(item))
}
private getInitialData(主题:主题){
这是http.get(`/call/to/backend`)
.flatMap(项目=>项目)
.认购(主题);
}
私有listenNewData(主题:主题){
this.websocketService.listen(“/some/ws/topic”)
.认购(主题);
}
私有初始化(){
常量主题=新主题();
this.dataService.getInitialData(主题);
本.ListenewData(主题);
subject.subscribe(item=>this.items.push(item))
}
当以这种方式注册主题时,主题似乎在HTTP解析后实际关闭,并且没有向主题发送websocket通知
但是,在对subscribes函数使用回调进行注册时:
private getInitialData(subject: Subject<any>) {
this._http.get<Array<any[]>>(`/call/to/backend`)
.flatMap(items => items)
.subscribe(item => subject.next(item));
}
private listenNewData(subject: Subject<any>) {
this.websocketService.listen('/some/ws/topic')
.subscribe(item => subject.next(item));
}
private getInitialData(主题:主题){
这是http.get(`/call/to/backend`)
.flatMap(项目=>项目)
.subscribe(item=>subject.next(item));
}
私有listenNewData(主题:主题){
this.websocketService.listen(“/some/ws/topic”)
.subscribe(item=>subject.next(item));
}
我没有问题,所有项目都已正确提取
我想知道为什么这两个版本是不同的,为什么在第一个案例中,主题最终是封闭的
谢谢您的帮助。为什么不使用forkjoin
const apiCalls = [
this._http.get<Array<any[]>>(`/call/to/backend`),
this.websocketService.listen('/some/ws/topic')
];
forkJoin(apiCalls)
.subscribe((results: Array<any>) => {
// results[0] = call from api call 1
// results[1] = call from api call 2
// so combine results: combined = results[0] + results[1]
this.items.push(combined)
}, (error) => console.log(error));
这是正确的行为。当您使用
.subscribe(subject)
时,您正在订阅所有三种类型的通知。所有受试者都是观察者,因此与写以下内容相同:
.subscribe(
v => subject.next(v),
err => subject.error(err),
() => subject.complete()
);
因此,如果您只使用
.subscribe(item=>subject.next(item))
您只传递下一个
通知,而没有错误
或完成
通知,因此主题
永远不会完成。在ListenewData
和getInitialData
中,您使用的是主题
的任何地方,而我确实忘记了编辑真实主题的剩余内容代码,谢谢。现在编辑好了。好的,我明白了。HttpClient observable在请求端调用complete,因此主题已完成。谢谢。.subscribe(subject.next)
有什么原因不能以同样的方式工作吗?我在自己的代码中尝试了这一点,但是next
没有被调用。
.subscribe(
v => subject.next(v),
err => subject.error(err),
() => subject.complete()
);