Pagrindinis » Kodavimas » Pradedama naudoti „JavaScript“ pažadus

    Pradedama naudoti „JavaScript“ pažadus

    Asinchroninis kodas yra naudinga atliekant užduotis laiko bet, žinoma, tai neturi trūkumų. Async kodas naudojamas atgalinio ryšio funkcijos apdoroti rezultatus, tačiau atgalinio ryšio funkcijos negali grąžinti vertybių kad tipinės „JavaScript“ funkcijos gali.

    Taigi jie ne tik atima mūsų gebėjimą valdyti funkcijos vykdymą bet taip pat klaidų tvarkymas šiek tiek vargo. Štai kur Pažadas objektą ateina, nes juo siekiama užpildyti kai kuriuos asinchroninis kodavimas.

    Pažadas yra techniškai a standartinis vidinis objektas „JavaScript“, tai reiškia, kad ji ateina „JavaScript“. Jis naudojamas atstovauti galimas asinchroninio kodo bloko rezultatas (arba kodo nepavykimo priežastis) ir turi metodus, kaip valdyti asinchroninio kodo vykdymas.

    Sintaksė

    Mes galime sukurti pavyzdys Pažadas objektą naudojant naujas raktinis žodis:

     naujas Promise (funkcija (išspręsti, atmesti) ); 

    Funkcija kaip parametras į Pažadas() konstruktorius yra žinomas kaip vykdytojas. Jis turi asinchroninį kodą ir turi du parametrus Funkcija tipas, vadinama išspręsti ir atmesti funkcijos (daugiau apie tai netrukus).

    Valstybių Pažadas objektą

    The pradinė būsena iš a Pažadas objektas yra vadinamas kol. Šioje būsenoje asinchroninio skaičiavimo rezultatas neegzistuoja.

    Pradinė laukiama būsena pasikeičia į įvykdė nurodykite, kada yra skaičiavimas sėkmingai. The apskaičiavimo rezultatas yra pasiekiama šioje būsenoje.

    Esant asinchroniniam skaičiavimui nepavyksta, Pažadas objektas juda į Atstumtas nustatyti nuo pradinio kol būsena. Šioje būsenoje dėl skaičiavimo gedimo (t. y. klaidos pranešimas).

    Išeiti iš kol į įvykdė būsena, išspręsti () vadinamas. Išeiti iš kol į Atstumtas būsena, atmesti () vadinamas.

    The tada ir sugauti metodus

    Kai valstybė pasikeičia nuo kol į įvykdė, įvykio tvarkytojas Pažadas objektas tada metodas vykdomas. Ir, kai valstybė pasikeičia nuo kol į Atstumtas, įvykio tvarkytojas Pažadas objektas sugauti metodas vykdomas.

    1 pavyzdys

    “Nežadintas” kodą

    Tarkime, kad yra hello.txt failą, kuriame yra “Sveiki” žodis. Štai kaip mes galime parašyti AJAX užklausą atsiųskite šį failą ir rodyti jo turinį, nenaudojant Pažadas objektas:

     funkcija getTxt () let xhr = naujas XMLHttpRequest (); xhr.open („GET“, „hello.txt“); xhr.overrideMimeType („tekstas / paprastas“); xhr.send (); xhr.onload = funkcija () try switch (this.status) case 200: document.write (this.response); pertrauka; 404 atvejis: mesti „Failas nerastas“; numatytasis: mesti „Nepavyko gauti failo“;  gaudyti (err) console.log (err);  getTxt (); 

    Jei failo turinys buvo sėkmingai įkelta, t.y. atsakymo būsenos kodas yra 200, atsakymo tekstas yra į dokumentą. Jei failas yra nerastas (statusas 404), a “Failas nerastas” klaidos pranešimas. Priešingu atveju, a bendras klaidos pranešimas nurodydamas, kad failas negaunamas.

    “Pažadėta” kodą

    Dabar, tegul Praneškite pirmiau minėtą kodą:

     funkcija getTxt () grąžinti naują Promise (funkcija (išspręsti, atmesti) let xhr = new XMLHttpRequest (); xhr.open („GET“, „hello.txt“); xhr.overrideMimeType („tekstas / paprastas“); xhr.send (); xhr.onload = funkcija () jungiklis (this.status) atvejis 200: išspręsti (this.response), atvejis 404: atmesti („Failas nerastas“), numatytasis: atmesti („Nepavyko atsiųskite failą ');;);  getTxt (), tada (funkcija (txt) document.write (txt);). catch (funkcija (err) console.log (err);); 

    The getTxt () funkcija dabar yra koduojama grąžinti naują. \ t Pažadas objektą, ir jo vykdytojo funkcija turi asinchroninį kodą iš ankstesnio.

    Kai atsakymo būsenos kodas yra 200, Pažadas yra įvykdė iki skambinimas išspręsti () (atsakymas perduodamas kaip parametras išspręsti ()). Kai būsenos kodas yra 404 arba kitas, Pažadas yra Atstumtas naudojant atmesti () (su atitinkamu klaidos pranešimu kaip atmesti ()).

    The įvykių tvarkytojai tada () ir sugauti () metodusPažadas objektas pabaigoje.

    Kai Pažadas yra įvykdė, -. \ t tada () metodas yra vykdomas. Jo argumentas yra parametras buvo perduotas išspręsti (). Renginio tvarkytojo viduje atsakymo tekstas (gautas kaip argumentas) yra į dokumentą.

    Kai Pažadas yra Atstumtas, įvykio tvarkytojas sugauti () metodas yra vykdomas, registruoti klaidą.

    The pagrindinis privalumas iš pirmiau minėtų Promisified kodo versija yra klaidų tvarkymas. Vietoj to, kad nenorėtumėme išskirtų išimčių, pavyzdžiui, nežadinamoje versijoje - tinkamus gedimo pranešimus grąžinami ir registruojami.

    Bet tai ne tik grįžimasgedimų pranešimai bet ir iš asinchroninio skaičiavimo rezultatas tai gali būti tikrai naudinga mums. Norėdami tai pamatyti, turėsime išplėsti mūsų pavyzdį.

    2 pavyzdys

    “Nežadintas” kodą

    Vietoj to, kad tiesiog rodytumėte tekstą hello.txt, aš noriu sujungti jį su “Pasaulis” žodis ir rodyti jį ekrane po 2 sekundžių. Štai kodas, kurį naudoju:

     funkcija getTxt () let xhr = naujas XMLHttpRequest (); xhr.open („GET“, „hello.txt“); xhr.overrideMimeType („tekstas / paprastas“); xhr.send (); xhr.onload = funkcija () try switch (this.status) case 200: document.write (concatTxt (this.response)); pertrauka; 404 atvejis: mesti „Failas nerastas“; numatytasis: mesti „Nepavyko gauti failo“;  gaudyti (err) console.log (err);  function concatTxt (res) setTimeout (funkcija () return (res + 'World')), 2000);  getTxt (); 

    Būsenos kode 200, concatTxt () funkcija susieti atsakymo tekstą su “Pasaulis” žodis prieš įrašydami jį į dokumentą.

    Bet šis kodas neveiks taip, kaip pageidaujama. The setTimeout () atgalinio ryšio funkcija negali grąžinti susietos eilutės. Kas bus išspausdinta dokumente neapibrėžtas nes tai yra concatTxt () grąžina.

    “Pažadėta” kodą

    Taigi, norėdami, kad kodas veiktų, tegul Praneškite pirmiau minėtą kodą, įskaitant concatTxt ():

     funkcija getTxt () grąžinti naują Promise (funkcija (išspręsti, atmesti) let xhr = new XMLHttpRequest (); xhr.open („GET“, „hello.txt“); xhr.overrideMimeType („tekstas / paprastas“); xhr.send (); xhr.onload = funkcija () jungiklis (this.status) atvejis 200: išspręsti (this.response), atvejis 404: atmesti („Failas nerastas“), numatytasis: atmesti („Nepavyko atsiųskite failą ');;);  funkcija concatTxt (txt) grąžinti naują Promise (funkcija (išspręsti, atmesti) setTimeout (funkcija () išspręsti (txt + 'World');, 2000););  getTxt (), tada ((txt) => return concatTxt (txt);) tada ((txt) => document.write (txt);). užklijuoti ((err) => konsolė. log (err);); 

    Tiesiog kaip getTxt (), concatTxt () taip pat veikia grąžina naują Pažadas objektą vietoj susieto teksto. The Pažadas grąžino concatTxt () yra išsprendė vidinio atšaukimo funkciją setTimeout ().

    Netoli pirmiau minėto kodo pabaigos, pirmojo įvykio tvarkytojas tada () metodas veikia, kai Pažadas apie getTxt () yra įvykdė, t. y. kai failas yra sėkmingai įkelta. Viduje to prižiūrėtojo, concatTxt () vadinamas ir Pažadas grąžino concatTxt () grąžinamas.

    Antrojo įvykio tvarkytojas tada () metodas veikia, kai Pažadas grąžino concatTxt () yra įvykdė, t.y. praėjo dvi sekundės ir išspręsti () vadinamas su susieta eilute kaip jo parametru.

    Pagaliau, sugauti () sugauti visas išimtis ir gedimų pranešimus iš abiejų pažadų.

    Šioje pažadėtoje versijoje “Labas pasauli” eilutė bus sėkmingai išspausdinta prie dokumento.