Autor Zpráva
err
Profil *
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();
je to z: v8.dev/features/promise-finally

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");
        });
    }
bude ten skript čekat na ty dvě then nebo ne?
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 *
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)
Ale to jsem asi v praxi nikde neviděl, protože to už nemá to výhodu zřetězení.

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 *
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
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 *
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
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 *
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
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í?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0