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 ()
metodus iš Paž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įžimas iš gedimų 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 ką 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.