Domača » Kodiranje » Uvod v obljube JavaScript

    Uvod v obljube JavaScript

    Asinhrona koda je uporaben za izvajanje nalog, ki so zamudno ampak, seveda, je ne smejo biti brez slabosti. Uporablja se koda Async funkcije povratnega klica za obdelavo rezultatov, vendar funkcije povratnega klica ne more vrniti vrednosti tipične funkcije JavaScript.

    Tako ne odvzamejo samo naše sposobnosti za obvladovanje izvedbo funkcije ampak tudi narediti ravnanje z napakami malo težav. Tukaj je Obljubi predmet prihaja, ker želi izpolniti nekatere luknje v asinhronem kodiranju.

    Obljubi je tehnično a standardni notranji predmet v JavaScriptu, kar pomeni, da prihaja vgrajeno v JavaScript. Uporablja se za predstavitev morebitni rezultat asinhronskega kodnega bloka (ali razlog, zakaj koda ni uspela) in ima metode za nadzor izvajanje asinhrone kode.

    Sintaksa

    Lahko ustvarimo primer Obljubi predmet uporabljati novo ključna beseda:

     nova obljuba (funkcija (razreši, zavrni) ); 

    Funkcija kot parameter do Obljuba () konstruktor je znan kot izvršitelj. Vsebuje asinhrono kodo in ima dva parametra Funkcija vrsto, kot je navedeno rešiti in zavrni funkcije (več o tem v kratkem).

    Države članice. \ T Obljubi predmet

    The začetno stanje a Obljubi se imenuje predmet v teku. V tem stanju je rezultat asinhronega izračuna ne obstaja.

    Začetno stanje čakanja se spremeni v izpolnjeni navedite, kdaj je računanje uspešno. The rezultat izračuna je na voljo v tem stanju.

    V primeru asinhronega izračuna ne uspe, Obljubi predmet premakne v zavrnjena od začetne v teku država. V tem stanju neuspeha računanja (to je sporočilo o napaki).

    Oditi od v teku do izpolnjeni država, razreši () je poklican. Oditi od v teku do zavrnjena država, zavrni () je poklican.

    The potem in ulov metod

    Ko je država spremembe od v teku do izpolnjeni, vodja dogodka Obljubi predmet potem metodo se izvede. In, ko država spremembe od v teku do zavrnjena, vodja dogodka Obljubi predmet ulov metodo se izvede.

    Primer 1

    “Ni odobreno” Koda

    Recimo, da obstaja hello.txt datoteko, ki vsebuje “zdravo” besedo. Na ta način lahko napišemo zahtevo za AJAX prenesi to datoteko in prikazati njeno vsebino, brez uporabe Obljubi predmet:

     funkcija getTxt () naj xhr = novo XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) primer 200: document.write (this.response); odmor; primer 404: vrgel 'datoteko ni najden'; privzeto: met 'Ne morem pridobiti datoteke';  catch (err) console.log (napačno);  getTxt (); 

    Če je bila vsebina datoteke uspešno preneseno, t.j.. koda statusa odgovora je 200, besedilo odgovora je v dokumentu. Če je datoteka ni najdeno (status 404), a “Datoteka ni najdena” vrne sporočilo o napaki. V nasprotnem primeru a sporočilo o splošni napaki ki označuje neuspeh pri pridobivanju datoteke, se vrne.

    “Promovirano” Koda

    Zdaj pa Sporočite zgornjo kodo:

     function getTxt () return new Promise (funkcija (razreši, zavrni) naj xhr = novo XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) primer 200: razreši (this.response); primer 404: zavrni ('File Not Found'); privzeto: zavrni ('Failed to naloži datoteko ');;);  getTxt (). (funkcija (txt) document.write (txt);). catch (funkcija (napačno) console.log (err);); 

    The getTxt () Funkcija je zdaj kodirana vrne nov primerek Obljubi predmet, in njegova izvršilna funkcija zadrži asinhrono kodo od prej.

    Ko koda statusa odziva je 200, Obljubi je izpolnjeni jo kliče razreši () (odgovor se prenese kot parameter za razreši ()). Ko je statusna koda 404 ali kakšna druga, Obljubi je zavrnjena uporabo zavrni () (z ustreznim sporočilom o napaki kot parameter za. \ t zavrni ()).

    The . \ t nato () in catch () metod od Obljubi predmet dodano na koncu.

    Ko Obljubi je izpolnjeni, vodnik nato () teče metoda. Njegov argument je parameter, ki je prešel iz razreši (). V upravljalniku dogodkov je besedilo odgovora (prejeto kot argument) v dokumentu.

    Ko Obljubi je zavrnjena, vodja dogodka catch () teče metoda, beleženje napake.

    The prednost od zgoraj Promovirana različica kode je ravnanje z napakami. Namesto, da bi nekontrolirane izjeme vrgli okoli - tako kot v različici brez promocije - ustreznih sporočil o napaki se vrnejo in zabeležijo.

    Ampak to ni samo vrnitev od sporočil o napaki ampak tudi rezultat asinhronega izračuna to je lahko za nas resnično ugodno. Da bi to videli, bomo morali razširiti naš primer.

    Primer 2

    “Ni odobreno” Koda

    Namesto prikazovanja besedila hello.txt, hočem združite z “Svet” besedo in ga prikažete na zaslonu po 2 sekundah. Tukaj je koda, ki jo uporabljam:

     funkcija getTxt () naj xhr = novo XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () try switch (this.status) primer 200: document.write (concatTxt (this.response)); odmor; primer 404: vrgel 'datoteko ni najden'; privzeto: met 'Ne morem pridobiti datoteke';  catch (err) console.log (napačno);  funkcija concatTxt (res) setTimeout (funkcija () return (res + 'World'), 2000);  getTxt (); 

    Na statusni kodi 200, concatTxt () funkcijo besedilo odgovora povežite z “Svet” besedo pred pisanjem v dokument.

    Ampak, ta koda ne bo delovalo po želji. The setTimeout () funkcija povratnega klica ne more vrniti združenega niza. Tisto, kar bo natisnjeno v dokument, je nedoločeno ker je to kaj concatTxt () vrne.

    “Promovirano” Koda

    Torej, da bi kodo delali, dajmo Sporočite zgornjo kodo, vključno z concatTxt ():

     function getTxt () return new Promise (funkcija (razreši, zavrni) naj xhr = novo XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) primer 200: razreši (this.response); primer 404: zavrni ('File Not Found'); privzeto: zavrni ('Failed to naloži datoteko ');;);  funkcija concatTxt (txt) vrne novo Promise (funkcija (razreši, zavrni) setTimeout (funkcija () razreši (txt + 'Svet');, 2000););  getTxt (), nato ((txt) => vrne concatTxt (txt);), nato ((txt) => document.write (txt);) catch ((err) => console. log (napačno);); 

    Tako kot getTxt (), concatTxt () funkcijo vrne novo Obljubi predmet namesto združenega besedila. The Obljubi vrnil concatTxt () je razrešena znotraj funkcije povratnega klica setTimeout ().

    Konec zgornje kode, vodja dogodka prvega nato () metoda teče, ko Obljubi od getTxt () je izpolnjeni, ko je datoteka uspešen. Znotraj tega vodnika, concatTxt () je poklican in Obljubi vrnil concatTxt () vrne.

    Upravljavec dogodka drugega nato () metoda teče, ko Obljubi vrnil concatTxt () je izpolnjeni, t.j. Časovna omejitev dveh sekund je končana in razreši () je poklican s povezanim nizom kot svojim parametrom.

    Končno, catch () ujema vsa izjeme in sporočila o napakah iz obeh obljub.

    V tej Razširjeni različici “Pozdravljen, svet” niz bo uspešno natisnjeno v dokument.