2016-09-02 6 views
4

Используя этот код:выбор разрешения, даже если 404?

fetch('notExists') // <---- notice 
    .then(
     function(response) 
     { 
      alert(response.status) 
     } 
    ) 
    .catch(function(err) 
    { 
     alert('Fetch Error : ', err); 
    }); 

Это обещание решает.

mdn

возвращает обещание, устраняющее в ответ на эту просьбу, является ли она успешной или нет.

Не странно ли, что неудачный запрос ajax разрешен, даже если он идет к несуществующему ресурсу?

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

Я знаю, что можно исследовать на ok собственности на response объекта, но все равно -

Вопрос

Почему выборки получает разрешен для совершенно плохой запрос (не существующего ресурса).

BTW , jquery request , does get rejected

+3

Он должен решить, так что вы можете обработать код ошибки. – Barmar

+0

@Barmar Так почему бы не обработчик catch/reject? –

+0

Ожидаете ли вы авторов стандарта выборки? Потому что они были бы теми, кто мог бы ответить на это без спекуляций. –

ответ

7

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() решили основать отказ на этом, это немного сложно сказать, не разговаривая с кем-то, кто действительно занимался дизайном этого интерфейса, но мне кажется логичным.Таким образом, отклонение говорит вам, прошел ли запрос и получил действительный ответ. Это зависит от вашего кода, чтобы решить, что делать с ответом. Разумеется, вы можете создать свою собственную функцию-оболочку, которая изменяет это поведение по умолчанию.

+0

Ой, я знаю, что сравнивать некуда, а '$ .ajax' с' // a' отклоняется. http://jsbin.com/pukurolego/1/edit?html,js,output –

+0

@RoyiNamir - Я не думаю, что вы пример jsbin - это то, что вы думаете. Если я 'console.log()' ошибка отклонения, я вижу это 'Не удалось загрузить ресурс: net :: ERR_ADDRESS_UNREACHABLE http: // 0.0.0.22 /'. Я точно не знаю, как работает jQuery, но ваш jsbin не тестирует правильную вещь. – jfriend00

+0

Ты прав, мой плохой, не видел. Мне нужен отдых . –

1

Отклонить обработчик для работы в сети и CORS ошибки IIRC. Если запрос достигнет сервера, и он отвечает действительным ответом HTTP, обещание будет выполнено, даже если ответ будет иметь код 4xx или 5xx.

0

Используйте этот код ...

fetch(`https://fercarvo.github.io/apps/integradora/DB/corpus.json`) 
.then(async (data) => { 
    if (data.ok) { 
     data = await data.json() 
     //Here you have your data... 
    } 
}).catch(e => console.log('Connection error', e)) 
Смежные вопросы