Подтвердить что ты не робот

Почему объект ответа от API-интерфейса API-интерфейса API является обещанием?

При запросе с сервера с API-интерфейсом JavaScript вы должны сделать что-то вроде

fetch(API)
  .then(response => response.json())
  .catch(err => console.log(err))

Здесь response.json() разрешает свое обещание.

Дело в том, что если вы хотите поймать ошибки 404, вам нужно решить обещание ответа, а затем отклонить обещание на выборку, потому что вы закончите только catch, если произошла сетевая ошибка. Таким образом, вызов fetch становится чем-то вроде

fetch(API)
  .then(response => response.ok ? response.json() : response.json().then(err => Promise.reject(err)))
  .catch(err => console.log(err))

Это намного труднее читать и рассуждать. Поэтому мой вопрос: зачем это нужно? Какой смысл иметь обещание в качестве значения ответа? Есть ли лучшие способы справиться с этим?

4b9b3361

Ответ 1

Если ваш вопрос: "Почему response.json() возвращает обещание?" то @Bergi дает ключ в комментариях: "он ждет, когда тело загрузится".

Если ваш вопрос "почему не является response.json атрибутом?", тогда потребовалось бы fetch отложить его ответ до тех пор, пока тело не загрузилось, что может быть нормально для некоторых, но не для всех.

Этот polyfill должен получить то, что вы хотите:

var fetchOk = api => fetch(api)
  .then(res => res.ok ? res : res.json().then(err => Promise.reject(err)));

то вы можете сделать:

fetchOk(API)
  .then(response => response.json())
  .catch(err => console.log(err));

Реверс не может быть заполнен.