Autor | Zpráva | ||
---|---|---|---|
err Profil * |
#1 · Zasláno: 24. 9. 2021, 22:52:50
Ahoj, proč je tam u toho response.text() await? Vždyť asynchronní je přeci jen fetch(), nebo ne?
const response = await fetch(url); const text = await response.text(); já mám toto: await fetch('/ajax', { method: 'post', body: send_Data, headers: {'X-Requested-With': 'XMLHttpRequest'} }) .then( response => response.json()) .then( data => { console.log("then"); }).catch(err => { console.log("catch"); }); } |
||
Radek9 Profil |
err:
Asynchronní je i ta metoda text (podobně jako json apod.), viz Response.text()
„bude ten skript čekat na ty dvě then nebo ne?“ V zásadě ano, protože then vrací nový Promise . Takže se čeká na ten poslední vrácený.
|
||
N71 Profil * |
#3 · Zasláno: 25. 9. 2021, 19:00:50
Použití metody then() by ti mělo napovědět (je to zpravidla metoda objektu Promise, takže jde nahradit konstruktem await).
|
||
Radek9 Profil |
N71:
To je hodně zjednodušené. :-) Uvnitř then lze vracet i synchronní výsledky, což taktéž vyústí v Promise . Příklad:
fetch(...) .then(res => res.text()) .then(text => text.toUpperCase()) // synchronní operace .then(ucText => console.log(ucText)) Podobně je možné na jakoukoli synchronní operaci použít i await :
const res = await fetch(...) const text = await res.text() const ucText = await text.toUpperCase() // synchronní operace console.log(ucText) Takže ono to až tak intuitivní není. Je prostě potřeba koukat do dokumentace (nebo do našeptávače), co ta funkce vrací. Pokud Promise , je použití then /await nutnost.
|
||
N71 Profil * |
#5 · Zasláno: 26. 9. 2021, 18:28:36
Proč zjednodušené? Promise.then(callback(value)) je zcela ekvivalentní awaitování value z asynchronní funkce, která tento Promise vrací. Je to je jen syntaktický cukr (IMO užitečný protože zpřehledňuje jinak šílené zanořování callbacků).
|
||
Radek9 Profil |
#6 · Zasláno: 27. 9. 2021, 10:20:29
N71:
Zjednodušené proto, že tvrdíš, že použití then by mělo napovědět. Nemusí. Jak jsem ukázal výše, naprosto běžně se takhle řetězí i synchronní operace. Pokud takový kód převádíme do nové syntaxe, není použití await nutné (ačkoli v zásadě ničemu nevadí). Ono zrovna to, že Response.text je asynchronní, opravdu není tak intuitivní. Člověk by mohl čekat, že jde jen o synchronní přístup k nějaké vlastnosti.
|
||
N71 Profil * |
#7 · Zasláno: 27. 9. 2021, 11:11:39
Radek9:
„naprosto běžně se takhle řetězí i synchronní operace“ Nevím, jestli běžně, ale z mého pohledu je to vlastně stejná chyba jako awaitovat synchronní příkaz. Jde to, nekončí to chybou, ale je to v zásadě blbost. |
||
Kajman Profil |
#8 · Zasláno: 27. 9. 2021, 11:20:35
Co když nevíš, jestli ten příkaz bude synchronní nebo ne? Třeba ve chvíli, kdy si ten příkaz někdo jiný může upravit podle svých potřeb. Není pak jistější to napsat obecně?
|
||
N71 Profil * |
#9 · Zasláno: 27. 9. 2021, 11:26:02
Kajman:
„Co když nevíš, jestli ten příkaz bude synchronní nebo ne?“ JavaScriptu je sice možné všechno, ale při programování přece nikdy neočekáváš, že by se v runtime změnila signatura metody. |
||
Kajman Profil |
#10 · Zasláno: 27. 9. 2021, 12:46:53
Když se třeba funkce předává parametrem, nikdy by jsi neuvítal, že může být asynchronní a knihovna si s tím poradí?
|
||
Časová prodleva: 2 roky
|
0