Ich habe fetch()
kürzlich mit der API herumgespielt und etwas bemerkt, das etwas schrullig war.
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
gibt ein Promise
Objekt zurück.
http://jsbin.com/wofulo/2/edit?js,output
Wenn es jedoch wie folgt geschrieben ist:
let url = "http://jsonplaceholder.typicode.com/posts/6";
let iterator = fetch(url);
iterator
.then(response => response.json())
.then(post => document.write(post.title));
;
post
Hier ist ein Standard, auf Object
den Sie zugreifen können.
http://jsbin.com/wofulo/edit?js,output
Meine Frage lautet also: Warum wird response.json
ein Versprechen in einem Objektliteral zurückgegeben, aber der Wert wird zurückgegeben, wenn er gerade zurückgegeben wird?
javascript
asynchronous
promise
fetch-api
Haveacigaro
quelle
quelle
response.json()
Versprechen möglicherweise abgelehnt wird, wenn die Antwort nicht gültig ist. JSON.Antworten:
Weil Sie die erhalten,
response
sobald alle Header angekommen sind. Wenn.json()
Sie anrufen, erhalten Sie ein weiteres Versprechen für den Text der http-Antwort, die noch geladen werden muss. Siehe auch Warum ist das Antwortobjekt von der JavaScript-Abruf-API ein Versprechen? .Denn so funktionieren Versprechen . Die Fähigkeit, Versprechen aus dem Rückruf zurückzugeben und sie zu übernehmen, ist ihr wichtigstes Merkmal. Sie macht sie verkettbar, ohne sie zu verschachteln.
Sie können verwenden
oder jeder andere Ansatz für den Zugriff auf frühere Versprechen führt zu einer .then () -Kette , um den Antwortstatus zu erhalten, nachdem der json-Körper gewartet hat.
quelle
JSON.parse()
anstelle vonres.json()
??res.json()
Grunde eine Abkürzung fürres.text().then(JSON.parse)
. Beide warten mit einem Versprechen auf die Daten und analysieren den JSON.Dieser Unterschied ist mehr auf das Verhalten von Promises zurückzuführen als
fetch()
spezifisch .Wenn ein
.then()
Rückruf einen zusätzlichen zurückgibtPromise
, den nächsten.then()
Rückruf in der Kette im Wesentlichen an dieses Versprechen gebunden und erhält seine Entschlossenheit oder lehnt Erfüllung und Wert ab.Das 2. Snippet hätte auch geschrieben werden können als:
Sowohl in dieser als auch in Ihrer Form wird der Wert von
post
durch das von zurückgegebene Versprechen bereitgestelltresponse.json()
.Wenn Sie jedoch eine Ebene zurückgeben
Object
, wird dies.then()
als erfolgreiches Ergebnis betrachtet und sofort aufgelöst, ähnlich wie bei:post
In diesem Fall handelt es sich einfach um das vonObject
Ihnen erstellte Objekt , das einPromise
in seinerdata
Eigenschaft enthält. Das Warten auf die Erfüllung dieses Versprechens ist noch unvollständig.quelle
Was mir auch geholfen hat, dieses von Ihnen beschriebene Szenario zu verstehen, ist die Promise-API- Dokumentation , in der erläutert wird, wie das von der
then
Methode zurückgegebene Versprechen je nach dem, was der Handler fn zurückgibt, unterschiedlich aufgelöst wird:quelle
Zusätzlich zu den obigen Antworten erfahren Sie hier, wie Sie mit einer Antwort der 500er-Serie von Ihrer API umgehen können, bei der Sie eine in json codierte Fehlermeldung erhalten:
quelle