2017-02-10 57 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