Проблема в том, что ваша функция handleError
, функция, которую вы передаете catch
, не обрабатывает ошибку, она фактически преобразует ошибку в новую ошибку и распространяет ее (с ней происходит сбой). Observable.prototype.catch
предназначен для обработки ошибок, а Observable.throw
предназначен для создания их. Затем эта ошибка возвращается, чтобы ввести сбой в результирующий поток.
Вот как будет выглядеть ваш код при использовании обычного Http-интерфейса
async performPostRequest(requestBody) {
try {
await response = this.http.post(this.callUrl, requestBody);
return this.extractData(response);
} catch (error) {
handleError(error);
}
}
function handleError(error) {
const unwrappedError = error && typeof error.json === 'function'
? error.json()
: error;
throw unwrappedError;
}
Я вижу в комментариях обсуждение того, какие возможности Angular 2 поддерживает для обработки ошибок http. Он поддерживает все случаи, которые вам могут понадобиться, включая обработку ошибок 404, но их документация очень плохая. Все их http-примеры и большинство их примеров в целом содержат слишком много кода.
Когда я говорю «слишком много кода», я имею в виду, что они содержат больше кода, чем вам следует писать, и много кода, который вам вообще не следует писать.
Вы вставили что-то очень близкое к их обработчику ошибок по умолчанию из их учебника в этом вопросе, не заметив поведения.
Вы никогда не должны делать это, очевидно!
Но если серьезно, почему они обрабатывают все ошибки во всех своих примерах? Ошибки всегда должны быть необработанными по умолчанию, чтобы они распространялись вверх по стеку и вызывали сбой там, где должны.
Взять за правило всегда ловить и снова бросать — ужасная практика.
Если вам нужен общий обработчик ошибок, он определенно не подходит для каждой службы, которая потребляет источник потенциальной ошибки, это безумие, но если вы будете следовать примерам, это то, что вы получите. Сотни строк повторяющегося, неподдающегося сопровождению шаблона, который следующему человеку, который будет работать над проектом, придется продираться, чтобы понять вашу бизнес-логику.
Кроме того, вы не должны не передавать несвязанные методы в качестве обратных вызовов, как в вашем примере, но это отдельный разговор.
person
Aluan Haddad
schedule
27.02.2017
import 'rxjs/add/operator/catch';
- person kind user   schedule 27.02.2017Observable
? Как 2_? - person kind user   schedule 27.02.2017Response | any
точно такой же, какany
. - person Aluan Haddad   schedule 27.02.2017