Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 订阅一个主题并关闭该主题的HTTP调用_Angular_Rxjs - Fatal编程技术网

Angular 订阅一个主题并关闭该主题的HTTP调用

Angular 订阅一个主题并关闭该主题的HTTP调用,angular,rxjs,Angular,Rxjs,我有两个可以获取给定对象的服务:一个用于获取完整列表的初始HTTP调用,以及用于实时更新新元素的websocket通知 我想将这两个调用连接到同一个可观察对象,以便显示页面不知道后端 这是马德斯的电话: private getInitialData(subject: Subject<any>) { this._http.get<Array<any[]>>(`/call/to/backend`) .flatMap(items =>

我有两个可以获取给定对象的服务:一个用于获取完整列表的初始HTTP调用,以及用于实时更新新元素的websocket通知

我想将这两个调用连接到同一个可观察对象,以便显示页面不知道后端

这是马德斯的电话:

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()
);