He estado jugando con la fetch()
API recientemente y noté algo que era un poco peculiar.
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => {
return {
data: response.json(),
status: response.status
}
})
.then(post => document.write(post.data));
;
post.data
devuelve un Promise
objeto.
http://jsbin.com/wofulo/2/edit?js,output
Sin embargo, si está escrito como:
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => response.json())
.then(post => document.write(post.title));
;
post
aquí hay un estándar al Object
que puede acceder el atributo de título.
http://jsbin.com/wofulo/edit?js,output
Entonces, mi pregunta es: ¿por qué response.json
devuelve una promesa en un objeto literal, pero devuelve el valor si se devuelve?
javascript
asynchronous
promise
fetch-api
haveacigaro
fuente
fuente
response.json()
promesa podría rechazarse si la respuesta no es JSON válido.Respuestas:
Porque recibe el
response
tan pronto como hayan llegado todos los encabezados. Al llamar,.json()
obtiene otra promesa para el cuerpo de la respuesta http que aún no se ha cargado. Consulte también ¿Por qué el objeto de respuesta de la API de recuperación de JavaScript es una promesa? .Porque así es como funcionan las promesas . La capacidad de devolver promesas de la devolución de llamada y hacer que se adopten es su característica más relevante, las hace encadenables sin anidar.
Puedes usar
o cualquier otro enfoque para acceder a la promesa anterior da como resultado una cadena .then () para obtener el estado de respuesta después de haber esperado el cuerpo json.
fuente
JSON.parse()
lugar deres.json()
??res.json()
básicamente es un atajo parares.text().then(JSON.parse)
. Ambos esperan los datos usando una promesa y analizan el json.Esta diferencia se debe al comportamiento de Promises más que
fetch()
específicamente.Cuando una
.then()
devolución de llamada devuelve un adicionalPromise
, la siguiente.then()
devolución de llamada en la cadena está esencialmente vinculada a esa Promesa, recibiendo su resolución o rechazo de cumplimiento y valor.El segundo fragmento también podría haberse escrito como:
Tanto en este formulario como en el suyo, el valor de
post
lo proporciona la Promesa devueltaresponse.json()
.Sin
Object
embargo, cuando devuelve un simple ,.then()
considera que es un resultado exitoso y se resuelve automáticamente, similar a:post
en este caso es simplemente elObject
que creó, que tiene unPromise
en sudata
propiedad. La espera para que se cumpla esa promesa es aún incompleta.fuente
Además, lo que me ayudó a comprender este escenario particular que describiste es la documentación de la API de Promise , específicamente donde explica cómo la promesa devuelta por el
then
método se resolverá de manera diferente dependiendo de lo que devuelva el controlador fn :fuente
Además de las respuestas anteriores, aquí se muestra cómo puede manejar una respuesta de la serie 500 de su api donde recibe un mensaje de error codificado en json:
fuente