A fetch()
звонок отклоняется, если по какой-либо причине сам запрос сети не работает (хост не найден, соединение отсутствует, сервер не отвечает и т. Д.).
Любой результат с сервера (404, 500 и т. Д.) Считается успешным запросом с точки зрения обещания. Понятно, что вы сделали запрос с сервера, и сервер ответил вам с сетевой точки зрения, запрос успешно завершен.
Затем вам необходимо проверить этот успешный ответ, чтобы узнать, есть ли тот тип ответа, который вы хотели. Если вы хотите 404, чтобы быть отказ, вы можете закодировать, что сами:
fetch('notExists').then(function(response) {
if (response.status !== 200) {
// make the promise be rejected if we didn't get a 200 response
throw new Error("Not 200 response")
} else {
// go the desired response
}
}).catch(function(err) {
// some error here
});
Вы можете даже сделать свой собственный myFetch()
, что просто делает это автоматически (преобразует любой статус ответа, не 200 к отрицанию).
В чем причина разрешенного обещания для совершенно плохого запроса (не существующий ресурс/сервер вниз).
Прежде всего, серверный сервер не будет генерировать успешный ответ - это отклонит.
Успешный ответ создается, если вы успешно подключаетесь к серверу, отправляете ему запрос и он возвращает ответ (любой ответ). Что касается «почему», дизайнеры интерфейса fetch()
решили основать отказ на этом, это немного сложно сказать, не разговаривая с кем-то, кто действительно занимался дизайном этого интерфейса, но мне кажется логичным.Таким образом, отклонение говорит вам, прошел ли запрос и получил действительный ответ. Это зависит от вашего кода, чтобы решить, что делать с ответом. Разумеется, вы можете создать свою собственную функцию-оболочку, которая изменяет это поведение по умолчанию.
Он должен решить, так что вы можете обработать код ошибки. – Barmar
@Barmar Так почему бы не обработчик catch/reject? –
Ожидаете ли вы авторов стандарта выборки? Потому что они были бы теми, кто мог бы ответить на это без спекуляций. –