Pourquoi L'objet response de JavaScript fetch API est-il une promesse?

lorsque vous demandez à un serveur avec L'API JavaScript fetch, vous devez faire quelque chose comme

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

ici, response.json() résout sa promesse.

le truc c'est que si vous voulez attraper les erreurs de 404 , vous devez résoudre la promesse de réponse et ensuite rejeter la promesse fetch, parce que vous ne finirez dans catch qu'en cas d'erreur réseau. Donc l'appel fetch devient quelque chose comme

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

C'est quelque chose de beaucoup plus difficile à lire et à comprendre. Donc ma question est: pourquoi est-ce nécessaire? À quoi bon avoir une promesse comme valeur de réponse? Sont-il de meilleures façons de gérer cela?

25
demandé sur The Guy with The Hat 2015-09-22 19:16:04

1 réponses

si votre question est "pourquoi response.json() retourner une promesse?"alors @Bergi fournit l'indice dans les commentaires: "il attend pour le corps à charge".

si votre question est "pourquoi response.json n'est-il pas un attribut?", alors il aurait fallu que fetch retarde le retour de sa réponse jusqu'à ce que le corps soit chargé, ce qui pourrait être acceptable pour certains, mais pas pour tout le monde.

ce polyfill devrait vous donner ce que vous voulez:

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

alors vous pouvez faire:

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

le verso ne peut pas être rempli en plusieurs exemplaires.

17
répondu jib 2017-08-14 20:21:00