我的Angular 2应用程序中的Observable是不可用的?

时间:2017-02-10 21:15:21

标签: javascript angular socket.io observable

我正在尝试使用我的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以期望数组而不是对象?我不清楚它为什么期望一个对象开始。

1 个答案:

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