Domovská » Kódování » Začínáme s přísliby JavaScriptu

    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.