Me gustaría obtener el código de estado http después de response.json para usarlo en mi lógica más tarde, ¿puedo hacer algo con él?
function apiRequest(path, options) { fetch("api/" + path, options) .then(response => response.json()) .then(data => { let res = { code: 200 //I want to put http status code here, data: data } return res; }) }
Esto es un poco complicado de usar then
(como lo está haciendo actualmente) porque desea obtener datos directamente de la respuesta (que es una promesa) y algunos datos más del cuerpo analizado (que es otra promesa).
Entonces puede envolver el estado y la promesa de datos en Promise.all y devolver eso desde el principio:
const apiRequest = () => { const url = "//swapi.dev/api/planets/1/"; fetch(url) .then((response) => Promise.all([response.status, response.json()])) .then(([status, data]) => console.log({status, data})) }
… pero sería más fácil usar la sintaxis async
/ await
y deshacerse de las devoluciones de llamada y luego solo tiene que preocuparse por una sola función (y, por lo tanto, el alcance) en lugar de múltiples.
const apiRequest = async () => { const url = "//swapi.dev/api/planets/1/"; const response = await fetch(url); const data = await response.json(); const status = response.status; console.log({status, data}) }
Como alternativa, podría considerar async/await
. De esa manera, tiene acceso a la response
y data
al mismo tiempo con mayor facilidad.
async function apiRequest(path, options) { const response = await fetch("api/" + path, options) const data = await response.json() let res = { code: response.status, data: data } // Do something with res }
Prueba esto
function apiRequest(path, options) { fetch("api/" + path, options) .then(response => Promise.all([Promise.resolve(response.status), response.json()])) .then(([status, data]) => { let res = { code: status //I want to put http status code here, data: data } return res; }) }