Javascript 在我的Angular 2应用程序中可以观察到这一点吗?

Javascript 在我的Angular 2应用程序中可以观察到这一点吗?,javascript,angular,socket.io,observable,Javascript,Angular,Socket.io,Observable,我正在尝试在Angular 2应用程序中使用基于socket.io的observable转换rest http observable。其余可观察的按原样工作。使用socket选项,我离得越来越近了,但是现在我得到一个错误,我在sockets中使用的可观察对象需要一个对象,而不是一个数组。我需要它是一个数组,能够遍历数据项 首先,这是我的服务中的原始http、rest可观察函数,它正在工作: getByGroup() { return this._http.get(this._url)

我正在尝试在Angular 2应用程序中使用基于socket.io的observable转换rest http observable。其余可观察的按原样工作。使用socket选项,我离得越来越近了,但是现在我得到一个错误,我在sockets中使用的可观察对象需要一个对象,而不是一个数组。我需要它是一个数组,能够遍历数据项

首先,这是我的服务中的原始http、rest可观察函数,它正在工作:

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);
   this.clientService.getByGroup()
        .subscribe(resRecordsData => this.records = resRecordsData,
        responseRecordsError => this.errorMsg = responseRecordsError);
我在组件中将记录声明为空数组。然后,我使用分配给记录的可观察结果打印到视图中。所有这些都非常有效

现在,这就是我尝试使用基于套接字的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);
   this.clientService.getByGroup()
        .subscribe(resRecordsData => this.records = resRecordsData,
        responseRecordsError => this.errorMsg = responseRecordsError);
但再一次,它在第二种情况下不起作用,因为我得到一个错误,说:

类型“{}”不可分配给类型“[]any”

那我怎么处理呢?我怎样才能欺骗服务套接字调用,使其期望的是数组而不是对象?我不清楚它为什么希望以对象开头。

如果数据是一个数组,那么以下应该编译并工作:

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;
}

谢谢有些东西仍然会引起问题,但我猜这是我们的套接字函数的api方面的问题。你这里的东西看起来不错。Re:您的响应,那么关键是:您必须显式地将可观察对象声明为any[]类型,否则它将隐式返回一个对象?我只是想知道为什么我最初的调用没有问题?TypeScript使用类型推断,在你的例子中,推断的类型是不兼容的,所以我显式地放置类型。好的,明白了。谢谢