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?
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.