Koduleht » Kodeerimine » Alustamine JavaScript lubadustega

    Alustamine JavaScript lubadustega

    Asünkroonne kood on kasulik ülesannete täitmiseks aega võttev aga muidugi see on puuduvad miinused. Async-kood kasutab tagasihelistamise funktsioonid tulemuste töötlemiseks, aga tagasihelistamisfunktsioonid ei saa väärtusi tagastada et tüüpilised JavaScript-funktsioonid saavad.

    Seega ei võta nad mitte ainult oma võimet kontrollida funktsiooni täitmist aga ka teha vigade käsitlemine natuke vaeva. See on koht, kus Lubadus objekti tuleb, sest selle eesmärk on täita mõned asünkroonse kodeerimise potholes.

    Lubadus on tehniliselt a standardne sisemine objekt JavaScriptis tähendab see seda sisseehitatud JavaScript. Seda kasutatakse asünkroonse koodiploki lõpptulemus (või põhjus, miks kood ebaõnnestus) ja on meetodid selle juhtimiseks asünkroonse koodi täitmine.

    Süntaksi

    Me saame luua näiteks Lubadus objekti kasutades uus märksõna:

     uus Promise (funktsioon (lahendada, tagasi lükata) ); 

    Funktsioon parameetrina Euroopa Lubadus () konstruktor on tuntud kui täitja. Sellel on asünkroonne kood ja on kaks parameetrit Funktsioon tüüp, nimetatakse lahendada ja lükake tagasi funktsioonid (nendest peagi lähemalt).

    Euroopa riigid Lubadus objekti

    The esialgne olek a Lubadus objekti nimetatakse ootel. Selles olekus asünkroonse arvutamise tulemus ei eksisteeri.

    Algne ootel olek muutub täidetud olek, millal arvutus on edukas. The arvutamise tulemus on saadaval selles olekus.

    Asünkroonse arvutuse korral ebaõnnestub, the Lubadus objekt liigub tagasi lükatud oleku algusest ootel olekus. Selles olekus arvutamise ebaõnnestumise tõttu (st veateade) on saadaval.

    Mine ootel kuni täidetud olekus, lahenda () kutsutakse. Mine ootel kuni tagasi lükatud olekus, lükkama () kutsutakse.

    The siis ja saak meetodid

    Kui riik muutub ootel kuni täidetud, sündmuse käitleja Lubadus objekti siis meetod täidetakse. Ja kui riik muutub ootel kuni tagasi lükatud, sündmuse käitleja Lubadus objekti saak meetod täidetakse.

    Näide 1

    “Lubamatu” kood

    Oletame, et seal on hello.txt faili, mis sisaldab “Tere” sõna. Siin on, kuidas me saame AJAXi taotluse kirjutada tõmba see fail ja näidata selle sisu, ilma Lubadus objekt:

     funktsioon getTxt () let xhr = uus XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (this.response); murda; juhtum 404: „Ei leitud faili”; vaikimisi: viska 'Faili hankimine ebaõnnestus';  saak (err) console.log (err);  getTxt (); 

    Kui faili sisu on olnud edukalt tõmmatud, s.t.. vastuse olekukood on 200, vastuse tekst on dokumentidesse. Kui fail on ei leitud (olek 404), a “Faili ei leitud” veateade visatakse. Vastasel korral a üldine veateade näitab, et fail on tõmmatud.

    “Lubatud” kood

    Nüüd, let's Lubage ülalnimetatud koodi:

     funktsioon getTxt () tagasi uus Promise (funktsioon (lahendada, lükkama) let xhr = uus XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = funktsioon () switch (this.status) case 200: lahendamine (this.response); juhtum 404: tagasilükkamine ('fail ei leitud'); vaikimisi: lükake ("ebaõnnestus faili tõmmata ');;);  getTxt () siis (funktsioon (txt) document.write (txt);). saak (funktsioon (err) console.log (err);); 

    The getTxt () funktsioon on nüüd kodeeritud tagastab uue Lubadus objekti, ja selle täitja funktsioon omab eelnevalt asünkroonset koodi.

    Kui vastuse olekukood on 200, the Lubadus on täidetud kõrval helistamine lahenda () (vastus edastatakse parameetrina lahenda ()). Kui olekukood on 404 või mõni muu, siis Lubadus on tagasi lükatud kasutades lükkama () (koos sobiva veateate parameetriga. \ t lükkama ()).

    The sündmuste käitlejad siis () ja saak () meetodid selle Lubadus objekt on lõpus.

    Kui Lubadus on täidetud, käitleja siis () meetodit. Tema argument on parameeter möödas lahenda (). Sündmuste käitleja sees on vastuse tekst (mis on esitatud argumentina) dokumentidesse.

    Kui Lubadus on tagasi lükatud, sündmuse käitleja saak () meetodit, vea logimine.

    The peamine eelis eeltoodud koodist on lubatud vigade käsitlemine. Selle asemel, et visata püütud erandeid ümber - nagu lubamatu versiooni -, on asjakohased tõrketeated tagastatakse ja logitakse.

    Aga see pole ainult naasmine selle tõrketeated kuid ka asünkroonse arvutamise tulemus see võib olla meile tõeliselt kasulik. Selle nägemiseks peame laiendama meie eeskuju.

    Näide 2

    “Lubamatu” kood

    Selle asemel, et lihtsalt teksti näidata hello.txt, Ma tahan ühendage see “Maailm” sõna ja kuvada see ekraanil pärast 2 sekundi möödumist. Siin on kasutatav kood:

     funktsioon getTxt () let xhr = uus XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) case 200: document.write (concatTxt (this.response)); murda; juhtum 404: „Ei leitud faili”; vaikimisi: viska 'Faili hankimine ebaõnnestus';  saak (err) console.log (err);  function concatTxt (res) setTimeout (funktsioon () return (res + 'World')), 2000);  getTxt (); 

    Olekukoodil 200 on concatTxt () funktsiooni kutsutakse ühendage vastuse tekst “Maailm” sõna enne dokumendi kirjutamist.

    Aga see kood ei tööta soovitud viisil. The setTimeout () tagasihelistamise funktsioon ei saa tagastatud ahelat tagasi saata. See, mis dokumendile trükitakse, on määratlemata sest see on mida concatTxt () naaseb.

    “Lubatud” kood

    Niisiis, et kood toimiks, olgem Lubage ülalnimetatud koodi, kaasa arvatud concatTxt ():

     funktsioon getTxt () tagasi uus Promise (funktsioon (lahendada, lükkama) let xhr = uus XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = funktsioon () switch (this.status) case 200: lahendamine (this.response); juhtum 404: tagasilükkamine ('fail ei leitud'); vaikimisi: lükake ("ebaõnnestus faili tõmmata ');;);  function concatTxt (txt) tagasi uus Promise (funktsioon (lahendada, lükkama) setTimeout (funktsioon () resolutiiv (txt + 'World');, 2000););  getTxt ()., siis ((txt) => return concatTxt (txt);), siis ((txt) => document.write (txt);) saak ((err) => konsool. log (err);); 

    Just nagu getTxt (), the concatTxt () funktsiooni tagastab uue Lubadus objekti koondatud teksti asemel. The Lubadus tagasi concatTxt () on lahendatud sees setTimeout ().

    Eespool nimetatud koodi lõpus on esimese sündmuse käitleja siis () meetod töötab siis, kui Lubadus of getTxt () on täidetud, see tähendab, kui fail on õnnestus. Selle käitleja sees, concatTxt () kutsutakse ja Lubadus tagasi concatTxt () tagastatakse.

    Teise sündmuse käitleja siis () meetod töötab siis, kui Lubadus tagasi concatTxt () on täidetud, st kaks sekundit on aegunud ja lahenda () kutsutakse kui selle parameetriks on lingitud string.

    Lõpuks, saak () püüab kõik erandid ja tõrketeated mõlemast lubadusest.

    Selles tõotatud versioonis “Tere, Maailm” string on edukalt välja trükitud dokumendile.