0

我已經定義了以下功能:Ionic 2:如何從創建的Observable中獲取錯誤?

searchProducts(searchText: string){ 
    return Observable.create(observer => { 
      return this._http.get(this._global.baseUrl + "/products/search/searchProducts?search=" + searchText) 
      .map(res => res.json()) 
       .subscribe(data => { 
         observer.next(data);  
         observer.complete(); 

       }, 
       err => { 
        return Observable.throw(err); // this statement is called 
        }); 
     }); 
    } 

這裏是調用語句:

this.productService.searchProducts(this.searchItem) 
       .subscribe(products => { 
        console.log(products); 
       }, 
       err => { 
       console.log(err); // this statement is not getting called 
       }); 

問題:當正從服務器產品的認購數據調用回調,但得到錯誤時(比如對於網絡連接超時或網絡錯誤),err回調沒有被調用。

我完全用盡嘗試或找到解決方案,有人可以幫忙嗎?

回答

0

http.get()方法返回一個可觀察對象。您不必將結果封裝在新的Observable中。 所以,你可以只寫你得到服務是這樣的:

searchProducts(text:string): Observable<Array<Product>> { 
    return this.http.get(this._global.baseUrl + "/products/search/searchProducts?search=" + searchText) 
     .map(res => res.json()) 
     .catch(this.handleError); 
} 

然後,處理錯誤:

protected handleError(error: Response): Observable<any> { 
    var errorJson = error.json(); 
    if (errorJson) { 
     console.error(errorJson.message); 
     return Observable.throw(errorJson.message || error); 
    } 
    return Observable.throw(error); 
} 
+0

謝謝...我已經實現了這個事情,它的作品,但我很好奇,想知道爲什麼嵌套的observables不起作用。我花了整整一天的時間找到問題。 –

+0

,因爲您的錯誤發生在訂閱之前。嘗試拋出你的錯誤以外的訂閱方法:.map()。catch()。subscribe() –

+0

刪除額外大括號(錯字),我有.subscribe()與2個參數 –