Angular2: Сервис с http - обработка ошибок (в ответе 200)

Итак, у меня есть служба, которая выполняет некоторые вызовы HTTP API...

все примеры, которые я нашел в Интернете, предполагают, что возвращенный JSON действителен...

то, что я хочу сделать, это вызвать тот же вызов, что и блок catch в http

so

getData(id: string): Observable<someEntity>{
    return this.http.get(someUrl)
        .map(this.handleResponse.bind(this))
        .catch(this.handleError);
}

private handleResponse(res: Response){
    if(res.status === 200){
        let body = res.text();
        if(!this.appService.IsJsonString(body)){
            return this.handleError(new Error('The response is not valid JSON '));
        }else{
            return res.json() || {};
        }
    }

}

private handleError (error: any) {
    this.appService.errorAdd(error.status, error.statusText, 'Error loading Index data', ErrorTypes.Data);

    let errMsg = (error.message) ? error.message : error.status ? `${error.status} - ${error.statusText}` : 'Server error';
    return Observable.throw(errMsg);
}

когда я делаю это в своем компоненте:

this.myService.getData(someID)
    .subscribe(
        data => {...},
        error => {
            // LOGIC HERE
        }
    );

Я хочу, чтобы обе ошибки обрабатывались // LOGIC HERE (блок ошибок).... а не одна в блоке успеха, а другая в ошибке

Что я делаю не так?


person DS_web_developer    schedule 16.08.2016    source источник
comment
как я уже сказал... Я хочу, чтобы мой компонент подписался и в блоке ошибок обрабатывал ОБА типа ошибок (сервер [код 300+ или ‹ 200]) И (анализ JSON или какую-либо другую проверку, которую я мог бы ввести [например, если объект ответа имеет как минимум 5 строк или что-то в этом роде))   -  person DS_web_developer    schedule 16.08.2016


Ответы (1)


Изменение handleResponse следующим образом удовлетворит ваши требования.

private handleResponse(res: Response){
    if(res.status === 200){
        let body = res.text();
        if(!this.appService.IsJsonString(body)){

            // Throw, instead of return
            throw 'The response is not valid JSON';

        }else{
            return res.json() || {};
        }
    }
}

Вы также можете избавиться от private handleError

getData(id: string): Observable<someEntity>{
    return this.http.get(someUrl)
        .map(this.handleResponse.bind(this));
        // Don't catch here
        // Let the subscription error block to handle error throw
        // .catch(this.handleError);
}

Если вы хотите скрыть объект RxJs от компонента

Измените способ вызова getData()

getData(
    id: string,
    callback: (result: any) => void,
    errorHandler) {

    this.http.get(someUrl)
        .map(this.handleResponse.bind(this))
        .subscribe(r => callback(r), e=>errorHandler);
}

В компоненте

this.myService.getData(
    someID,
    data => {...},
    error => {
        // LOGIC HERE
    }
);
person John Siu    schedule 16.08.2016
comment
хорошо... выглядит близко к тому, что я хочу... надо будет проверить завтра... УРА! - person DS_web_developer; 16.08.2016
comment
@DS_web_developer Обновлено правильным решением. Мой оригинальный ответ хорошо выглядит на экране, но не работает. :П - person John Siu; 16.08.2016