我正在尝试使用我的Angular 2应用程序中基于socket.io的observable转换其余的http observable。其余的可观察的工作原理。使用套接字选项,我越来越近了,但是现在我收到一个错误,说我正在使用套接字的observable需要一个对象,而不是一个数组。我需要它成为一个能够迭代数据项的数组。
首先,这是我服务的原始http,rest observable函数(这是IS工作):
getByGroup() {
return this._http.get(this._url)
.map((response: Response) => response.json())
.catch(this._errorsHandler);
}
_errorsHandler(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
在我正在订阅的组件中这样:
this.clientService.getByGroup()
.subscribe(resRecordsData => this.records = resRecordsData,
responseRecordsError => this.errorMsg = responseRecordsError);
我在组件中声明为空数组的“记录”。然后我使用observable的结果(分配给“records”)打印到视图。以上所有都很完美。
现在这就是我正在尝试使用基于套接字的observable(这不起作用 - 它期望一个对象而不是一个数组) - 我需要帮助理解原因:
getByGroup() {
const observable = new Observable(observer => {
this.socket = io(this._url);
this.socket.on('getByStage', (data) => {
return data;
});
return () => {
this.socket.disconnect();
};
});
return observable;
}
同样,我试图以同样的方式订阅这个可观察对象,如下所示:
this.clientService.getByGroup()
.subscribe(resRecordsData => this.records = resRecordsData,
responseRecordsError => this.errorMsg = responseRecordsError);
但同样,它在第二个实例中不起作用,因为我收到一个错误说:
类型“{}”不能指定为“[] any”。
那我怎么办呢?如何使服务套接字调用finagle以期望数组而不是对象?我不清楚它为什么期望一个对象开始。
答案 0 :(得分:1)
如果data
是一个数组,则以下内容应该编译并运行:
getByGroup():Observable<any[]> {
const observable = new Observable<any[]>(observer => {
this.socket = io(this._url);
this.socket.on('getByStage', (data) => {
observer.next(data);
});
return () => {
this.socket.disconnect();
};
});
return observable;
}