Začínáme s přísliby JavaScriptu
Asynchronní kód je užitečný pro plnění úkolů, které jsou časově náročné ale samozřejmě ne bez zábran. Async kód používá funkce zpětného volání zpracovávat výsledky, ale funkce zpětného volání nemůže vrátit hodnoty typické funkce JavaScriptu.
Tak nejenže odnášejí naši schopnost ovládat funkce ale také vypořádání se s chybou trochu hádka. Toto je místo, kde Slib
objekt přichází, jak se snaží vyplnit některé z výmoly v asynchronním kódování.
Slib
je technicky a standardní vnitřní objekt v JavaScriptu, což znamená, že přichází vestavěný do JavaScriptu. Používá se k reprezentaci eventuální výsledek asynchronního kódového bloku (nebo důvod, proč kód selhal) a má metody kontroly provedení asynchronního kódu.
Syntax
Můžeme vytvořit instanci Slib
objekt za použití Nový
klíčové slovo:
nový slib (funkce (rozhodnutí, odmítnutí) );
Funkce předán jako parametr na Slib()
konstruktor je známý jako vykonavatel. Drží asynchronní kód a má dva parametry Funkce
typ, jako odhodlání
a odmítnout
funkce (více o nich brzy).
Státy Slib
objekt
počáteční stav of a Slib
objektu čekající. V tomto stavu je výsledkem asynchronního výpočtu neexistuje.
Počáteční stav čekající na zpracování se změní na splněny stavu, kdy je výpočet úspěšný. výsledku výpočtu je k dispozici v tomto stavu.
V případě asynchronního výpočtu nezdaří, Slib
objekt se přesune na zamítnuta státu od jeho počátečního čekající Stát. V tomto stavu důvodu selhání výpočtu (tj. chybová zpráva).
Odejít čekající na splněny Stát, odhodlání()
je nazýván. Odejít čekající na zamítnuta Stát, odmítnout()
je nazýván.
pak
a úlovek
metody
Když stát změny od čekající na splněny, obsluha události Slib
objektu pak
metoda je proveden. A když stát změny od čekající na zamítnuta, obsluha události Slib
objektu úlovek
metoda je proveden.
Příklad 1
“Non-Promisified” kód
Předpokládejme, že existuje hello.txt
obsahující soubor “Ahoj” slovo. Zde je popsáno, jak můžeme napsat požadavek AJAX načíst tento soubor a zobrazit jeho obsah, bez použití Slib
objekt:
funkce getTxt () let xhr = nová XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) případ 200: document.write (this.response); přestávka; případ 404: hodit 'Soubor nebyl nalezen'; default: throw 'Selhalo načtení souboru'; catch (err) console.log (err); getTxt ();
Pokud byl obsah souboru úspěšně načteno, tj. kód stavu odpovědi je 200, text odpovědi je do dokumentu. Pokud je soubor nenalezeno (stav 404), A “Soubor nenalezen” chybová zpráva je hozena. Jinak a obecná chybová zpráva označující selhání načítání souboru.
“Promisified” kód
Pojďme Promiňte výše uvedený kód:
funkce getTxt () return new Promise (funkce (vyřešení, odmítnutí) let xhr = nový XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) případ 200: vyřešení (this.response); případ 404: odmítnutí ('Soubor nebyl nalezen'); výchozí: odmítnutí ('Nepodařilo se načíst soubor ');;); getTxt (). pak (funkce (txt) document.write (txt);). catch (function (err) console.log (err););
getTxt ()
funkce je nyní kódována vrátit novou instanci Slib
objekt, a jeho funkce vykonavatele uchovává asynchronní kód dříve.
Když kód stavu odpovědi je 200, Slib
je splněny podle povolání odhodlání()
(odpověď je předána jako parametr odhodlání()
). Pokud je stavový kód 404 nebo některý jiný, pak Slib
je zamítnuta použitím odmítnout()
(s příslušnou chybovou zprávou jako parametr odmítnout()
).
obsluhy událostí pro. \ t pak()
a úlovek()
metody z Slib
objekt na konci.
Když Slib
je splněny, psovoda pak()
metoda je spuštěna. Její argument je parametr předán odhodlání()
. Uvnitř obsluhy události je text odpovědi (přijatý jako argument) do dokumentu.
Když Slib
je zamítnuta, obsluha události úlovek()
metoda je spuštěna, protokolování chyby.
hlavní výhodou výše uvedené verze programu Promisified je kód vypořádání se s chybou. Místo házení Uncaught výjimek kolem - jako v Non-Promisified verze - zprávy o selhání jsou vráceny a zaznamenány.
Ale nejde jen o to návratu z zprávy o selhání ale také výsledek asynchronního výpočtu to může být pro nás skutečně výhodné. Abychom to mohli vidět, budeme muset rozšířit náš příklad.
Příklad 2
“Non-Promisified” kód
Místo pouhého zobrazení textu hello.txt
, chci kombinovat s “Svět” slovo a zobrazte jej na obrazovce po uplynutí 2 sekund. Zde je kód, který používám:
funkce getTxt () let xhr = nová XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) případ 200: document.write (concatTxt (this.response)); přestávka; případ 404: hodit 'Soubor nebyl nalezen'; default: throw 'Selhalo načtení souboru'; catch (err) console.log (err); funkce concatTxt (res) setTimeout (function () return (res + 'World'), 2000); getTxt ();
Na stavovém kódu 200, concatTxt ()
funkce spojit text odpovědi s “Svět” slovo před zápisem do dokumentu.
Ale tento kód nebude fungovat podle potřeby. setTimeout ()
funkce zpětného volání nelze vrátit zřetězený řetězec. Co bude vytištěno do dokumentu je undefined
protože to je co concatTxt ()
vrátí.
“Promisified” kód
Takže, aby kód fungoval, pojďme Promiňte výše uvedený kód, počítaje v to concatTxt ()
:
funkce getTxt () return new Promise (funkce (vyřešení, odmítnutí) let xhr = nový XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) případ 200: vyřešení (this.response); případ 404: odmítnutí ('Soubor nebyl nalezen'); výchozí: odmítnutí ('Nepodařilo se načíst soubor ');;); funkce concatTxt (txt) return new Promise (funkce (vyřešit, odmítnout) setTimeout (function () vyřešení (txt + 'Svět');, 2000);); getTxt (). pak ((txt) => return concatTxt (txt);). Potom ((txt) => document.write (txt);). catch ((err) => konzole. log (err););
Stejně jako getTxt ()
, concatTxt ()
funkce vrátí nový Slib
objekt místo zřetězeného textu. Slib
vrátil concatTxt ()
je vyřešena uvnitř funkce zpětného volání setTimeout ()
.
Blízko konce výše uvedeného kódu je obsluha události první pak()
metoda běží, když Slib
z getTxt ()
je splněny, tj. když je soubor úspěšně načteno. Uvnitř toho psovoda, concatTxt ()
je nazýván a Slib
vrátil concatTxt ()
je vrácena.
Obsluha události druhého pak()
metoda běží, když Slib
vrátil concatTxt ()
je splněny, tj uplynuly dvě sekundy a odhodlání()
je nazýván s jeho řetězcem.
Konečně, úlovek()
zachytí všechny výjimky a zprávy o selhání z obou slibů.
V této Promisified verzi, “Ahoj světe” řetězec bude úspěšně vytištěno dokumentu.