0

я определил следующие функции:Ионный 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 call не вызван.

Я полностью измучен попытками найти решение, может ли кто-нибудь помочь?

ответ

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

Спасибо ... Я уже реализовали эту вещь, и она работает, но мне интересно знать почему вложенные наблюдаемые не работают. Я потратил целый день на то, чтобы найти проблему. –

+0

, потому что ваша ошибка возникает перед подпиской. Попробуйте бросить свою ошибку за пределами метода подписки: .map(). Catch(). Subscribe() –

+0

удалил лишнюю фигурную скобку (опечатку), у меня была .subscribe() с 2 аргументами –