2017-02-10 58 views
0

我想转换休息http observable与我的Angular 2应用程序中的基于socket.io的可观察。其余可观察的工作原样。随着套接字选项,我越来越接近,但现在我得到一个错误,说我用于套接字的可观察性期望一个对象,而不是一个数组。我需要它是一个能够迭代数据项的数组。与我的Angular 2应用程序不工作的这个Observable?

首先,这里的原始HTTP,休息观察到的功能从我的服务(这是工作):

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的结果打印到视图。以上所有的工作都很完美。

现在,这就是我想用做插座基于观察到的(这是行不通的 - 这是在等一个对象,而不是一个数组) - 我需要帮助理解为什么:

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''。

那么我该如何处理呢?我怎样才能使服务套接字调用期望一个数组而不是一个对象?我不清楚为什么它期待一个对象开始。

回答

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

感谢。有些东西仍然会导致问题 - 但我的猜测是这是我们的socket函数在api方面的一些东西。你在这里看起来是正确的。 Re:你的回应,关键是:你必须显式声明Observable是“any []”类型,否则它会隐式地返回一个对象?只是想知道为什么我的原始电话不是问题? – Muirik

+0

TypeScript使用类型推断,并在你的情况下推断类型不兼容,所以我明确地把类型。 – kemsky

+0

好吧,明白了。谢谢。 – Muirik