javascript - sincronas - promesas typescript
¿Por qué el objeto de respuesta de JavaScript fetch API es una promesa? (1)
Si su pregunta es "¿por qué
response.json()
devuelve una promesa?"
entonces @Bergi proporciona la pista en los comentarios: "espera a que se cargue el cuerpo".
Si su pregunta es "¿por qué no es
response.json
un atributo?", Eso habría requerido que
fetch
retrasara la respuesta hasta que el cuerpo se hubiera cargado, lo que podría estar bien para algunos, pero no para todos.
Este polyfill debería darte lo que quieres:
var fetchOk = api => fetch(api)
.then(res => res.ok ? res : res.json().then(err => Promise.reject(err)));
entonces puedes hacer:
fetchOk(API)
.then(response => response.json())
.catch(err => console.log(err));
El reverso no se puede rellenar.
Al solicitar desde un servidor con API de recuperación de JavaScript, debe hacer algo como
fetch(API)
.then(response => response.json())
.catch(err => console.log(err))
Aquí,
response.json()
está resolviendo su promesa.
La cuestión es que si desea detectar los errores de
404
, debe resolver la promesa de respuesta y luego rechazar la promesa de búsqueda, porque solo terminará en
catch
si ha habido un error de red.
Entonces la llamada de búsqueda se convierte en algo así como
fetch(API)
.then(response => response.ok ? response.json() : response.json().then(err => Promise.reject(err)))
.catch(err => console.log(err))
Esto es algo mucho más difícil de leer y razonar. Entonces mi pregunta es: ¿por qué se necesita esto? ¿Cuál es el punto de tener una promesa como valor de respuesta? ¿Hay alguna forma mejor de manejar esto?