Eu tenho mexido com a fetch()
API recentemente e percebi algo um pouco estranho.
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
retorna um Promise
objeto.
http://jsbin.com/wofulo/2/edit?js,output
No entanto, se estiver 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
aqui está um padrão Object
que você pode acessar o atributo title.
http://jsbin.com/wofulo/edit?js,output
Portanto, minha pergunta é: por que response.json
retorna uma promessa em um objeto literal, mas retorna o valor se acabou de retornar?
javascript
asynchronous
promise
fetch-api
Haveacigaro
fonte
fonte
response.json()
promessa pode ser rejeitada se a resposta não for um JSON válido.Respostas:
Porque você recebe o
response
assim que todos os cabeçalhos chegarem. Chamar.json()
oferece outra promessa para o corpo da resposta http que ainda não foi carregada. Consulte também Por que o objeto de resposta da API de busca de JavaScript é uma promessa? .Porque é assim que as promessas funcionam . A capacidade de retornar promessas do retorno de chamada e fazer com que sejam adotadas é seu recurso mais relevante, pois as torna encadeadas sem aninhamento.
Você pode usar
ou qualquer outra das abordagens para acessar resultados de promessa anteriores em uma cadeia .then () para obter o status de resposta após ter esperado o corpo json.
fonte
JSON.parse()
vez deres.json()
??res.json()
é basicamente um atalho parares.text().then(JSON.parse)
. Ambos aguardam os dados usando uma promessa e analisam o json.Essa diferença se deve ao comportamento das Promessas mais do que
fetch()
especificamente.Quando um
.then()
retorno de chamada retorna um adicionalPromise
, o próximo.then()
retorno de chamada na cadeia é essencialmente vinculado a essa promessa, recebendo sua resolução ou rejeição, cumprimento e valor.O segundo snippet também pode ter sido escrito como:
Tanto neste formulário como no seu, o valor de
post
é fornecido pela promessa devolvida deresponse.json()
.Quando você retorna um plano
Object
, no entanto,.then()
considera que um resultado bem-sucedido e se resolve imediatamente, semelhante a:post
neste caso, é simplesmente o queObject
você criou, que contém umPromise
em suadata
propriedade. A espera para que essa promessa seja cumprida ainda está incompleta.fonte
Além disso, o que me ajudou a entender esse cenário específico que você descreveu é a documentação da API Promise , especificamente onde ela explica como a promessa retornada pelo
then
método será resolvida de forma diferente dependendo do que o manipulador fn retorna:fonte
Além das respostas acima, aqui está como você pode lidar com uma resposta da série 500 de sua api, em que recebe uma mensagem de erro codificada em json:
fonte