Homepage » Coding » A JavaScript ígéreteinek megkezdése

    A JavaScript ígéreteinek megkezdése

    Aszinkron kód hasznos a feladatok végrehajtásához időigényes de természetesen nincsenek hátrányai. Az aszinkron kódot használja visszahívási funkciók eredményeinek feldolgozása, azonban a visszahívási funkciók nem tud visszatérni az értékekre hogy a tipikus JavaScript funkciók képesek.

    Így nemcsak elvesztik a képességünket, hogy irányítsuk a a funkció végrehajtása de azt is hibakezelés egy kis gond. Ez az, ahol a Ígéret tárgy jön, mivel célja, hogy kitöltse néhányat aszinkron kódolásban.

    Ígéret technikailag a szabványos belső objektum JavaScript-ben, ami azt jelenti, hogy jön beépített JavaScript. Ezt használják a az aszinkron kódblokk végeredménye (vagy az ok, amiért a kód meghiúsult) és módszerei a vezérlésre az aszinkron kód végrehajtása.

    Szintaxis

    Létrehozhatunk egy példánya Ígéret tárgy használni a új kulcsszó:

     új ígéret (funkció (rendezés, elutasítás) ); 

    A funkció paraméterként hoz Ígéret() a konstruktort a végrehajtó. Tartalmazza az aszinkron kódot és két paramétere van Funkció típus, a továbbiakban elhatározás és elutasít funkciók (röviden ezekről röviden).

    Államok Ígéret tárgy

    A kezdeti állapot az a Ígéret az objektum neve függőben levő. Ebben az állapotban az aszinkron számítás eredménye nem létezik.

    A kezdeti függőben lévő állapot megváltozik teljesülnek állapítsa meg, mikor van a számítás sikeres. A a számítás eredménye elérhető ebben az állapotban.

    Az aszinkron számítás esetén nem sikerül, a Ígéret az objektum a elutasított állapotát a kezdetétől függőben levő állapot. Ebben az állapotban a a számítási hiba miatt (azaz hibaüzenet) elérhetővé válik.

    Ahhoz, hogy menjen függőben levő nak nek teljesülnek állapot, elhatározás() nak, nek hívják. Ahhoz, hogy menjen függőben levő nak nek elutasított állapot, elutasít() nak, nek hívják.

    A azután és fogás mód

    Amikor az állam megváltozik függőben levő nak nek teljesülnek, az esemény kezelője Ígéret objektum azután eljárás végrehajtásra kerül. És amikor az állam megváltozik függőben levő nak nek elutasított, az esemény kezelője Ígéret objektum fogás eljárás végrehajtásra kerül.

    1. példa

    “Nem Promisified” kód

    Tegyük fel, hogy van egy hello.txt fájlt tartalmazó “Szia” szó. Íme, hogyan írhatunk egy AJAX-kérést letölteni ezt a fájlt és megjeleníteni a tartalmát, használata nélkül Ígéret tárgy:

     függvény getTxt () let xhr = új XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ( 'text / plain'); xhr.send () eljárást; xhr.onload = függvény () try switch (this.status) case 200: document.write (this.response); szünet; 404 eset: „Fájl nem található”; alapértelmezett: dobja a 'Fájl lekérése sikertelen';  fogás (err) console.log (err);  getTxt (); 

    Ha a fájl tartalma megtörtént sikeresen beolvasott, azaz. a válasz állapotkódja 200, a válasz szöveg a dokumentumba. Ha a fájl nem található (404 állapot), egy “Fájl nem található” hibaüzenet jelenik meg. Ellenkező esetben a általános hibaüzenet a fájl beolvasásának sikertelenségét jelzi.

    “Promisified” kód

    Most, hadd Ígérjük meg a fenti kódot:

     funkció getTxt () vissza az új Promise (funkció (megoldani, elutasítani) let xhr = új XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = függvény () switch (this.status) 200. eset: megoldás (this.response); 404 eset: elutasítás („Fájl nem található”); alapértelmezett: elutasítja („Nem sikerült Fetch the file ');;);  getTxt (), majd (függvény (txt) document.write (txt);) .fogás (funkció (err) console.log (err);); 

    A getTxt () A funkció most kódolva van visszaad egy új példányt Ígéret tárgy, és a végrehajtó funkciója rendelkezik az aszinkron kóddal.

    Amikor az a válasz állapotkódja 200, a Ígéret jelentése teljesülnek által hívás elhatározás() (a válasz a (z) elhatározás()). Amikor az állapotkód 404 vagy más, a Ígéret jelentése elutasított használva elutasít() (a megfelelő hibaüzenetként a elutasít()).

    A eseménykezelők a azután() és fogás() mód a Ígéret objektum hozzáadódik a végén.

    Amikor az Ígéret jelentése teljesülnek, a azután() a módszer fut. Az érv az a paraméter áthaladt elhatározás(). Az eseménykezelőn belül a válasz szöveg (az érvként kapott) a dokumentumba.

    Amikor az Ígéret jelentése elutasított, az esemény kezelője fogás() a módszer fut, a hiba naplózása.

    A fő előnye A fenti kód ígéretes változata a hibakezelés. Ahelyett, hogy eldobott kivételeket dobnánk - mint a nem ígéretes változatban - a megfelelő hibaüzeneteket vissza, és naplózott.

    De ez nem csak az visszatérő a hibaüzenetek hanem a az aszinkron számítás eredménye ami valóban előnyös lehet számunkra. Hogy ezt lássuk, bővítenünk kell példát.

    2. példa

    “Nem Promisified” kód

    Ahelyett, hogy csak megjelenítené a szöveget hello.txt, akarok kombinálja a “Világ” szó és jelenítse meg a képernyőn 2 másodperc elteltével. Íme az általam használt kód:

     függvény getTxt () let xhr = új XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ( 'text / plain'); xhr.send () eljárást; xhr.onload = függvény () try switch (this.status) case 200: document.write (concatTxt (this.response)); szünet; 404 eset: „Fájl nem található”; alapértelmezett: dobja a 'Fájl lekérése sikertelen';  fogás (err) console.log (err);  function concatTxt (res) setTimeout (függvény () return (res + 'World'), 2000);  getTxt (); 

    A 200-as állapotkódon a concatTxt () funkciót hívják összekapcsolja a válasz szövegét a “Világ” szó írja be a dokumentumba.

    De ez a kód nem fog működni a kívánt módon. A setTimeout () visszahívási funkció nem tudja visszaadni a tömörített karakterláncot. Mi lesz a dokumentum kinyomtatása határozatlan mert ez az mit concatTxt () visszatér.

    “Promisified” kód

    Tehát, hogy a kódot működtessük Ígérjük meg a fenti kódot, beleértve concatTxt ():

     funkció getTxt () vissza az új Promise (funkció (megoldani, elutasítani) let xhr = új XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = függvény () switch (this.status) 200. eset: megoldás (this.response); 404 eset: elutasítás („Fájl nem található”); alapértelmezett: elutasítja („Nem sikerült Fetch the file ');;);  függvény concatTxt (txt) vissza az új ígéret (funkció (megoldani, elutasítani) setTimeout (függvény () Resolution (txt + 'World');, 2000););  getTxt (), majd ((txt) => return concatTxt (txt);), majd ((txt) => document.write (txt);) .fogás ((err) => konzol. log (err);); 

    Mint getTxt (), a concatTxt () funkció is új értéket ad vissza Ígéret tárgy az összefűzött szöveg helyett. A Ígéret vissza concatTxt () jelentése a belső visszahívási funkciót megoldotta setTimeout ().

    A fenti kód vége közelében az első eseménykezelője azután() módszer fut, amikor a Ígéret nak,-nek getTxt () jelentése teljesülnek, vagyis amikor a fájl van sikerült. A kezelő belsejében, concatTxt () nak, nek hívják és a Ígéret vissza concatTxt () visszatér.

    A második esemény eseménykezelője azután() módszer fut, amikor a Ígéret vissza concatTxt () jelentése teljesülnek, azaz a két másodperces időzítés véget ért és elhatározás() nak, nek hívják a konkatenált karaktersorozat paraméterével.

    Végül, fogás() elkapja az összes kivételt és hibaüzenetet mindkét ígéretből.

    Ebben az ígéretes változatban a “Helló Világ” a karakterlánc lesz sikeresen kinyomtatott a dokumentumhoz.