Hjemmeside » Coding » Komme i gang med JavaScript-løfter

    Komme i gang med JavaScript-løfter

    Asynkron kode er nyttig for å utføre oppgaver som er tidkrevende men selvfølgelig er det det ikke blottet for ulemper. Async-kode bruker tilbakeringingsfunksjoner å behandle sine resultater, men tilbakekallingsfunksjoner kan ikke returnere verdier som typiske JavaScript-funksjoner kan.

    Dermed tar de ikke bare vår evne til å kontrollere utførelse av funksjonen men også gjøre feilhåndtering litt stresset. Det er her Love gjenstand kommer inn, da den tar sikte på å fylle ut noen av potholes i asynkron koding.

    Love er teknisk a standard intern objekt i JavaScript, noe som betyr at den kommer innebygd i JavaScript. Det er vant til å representere eventuelt resultat av en asynkron kodeblokk (eller grunnen til at koden mislyktes) og har metoder for å kontrollere utførelse av den asynkrone koden.

    syntax

    Vi kan lage en forekomst av Love gjenstand bruker ny søkeord:

     nytt løfte (funksjon (løse, avvise) ); 

    Funksjonen passert som en parameter til Love() Konstruktøren er kjent som byrder. Den har asynkron kode og har to parametere av Funksjon type, referert til som Løse og avvise funksjoner (mer om disse kort tid).

    Stater av Love gjenstand

    De opprinnelige tilstand av a Love objekt kalles i påvente av. I denne tilstanden er resultatet av den asynkrone beregningen eksisterer ikke.

    Den innledende ventende tilstanden endres til oppfylt angi når beregningen er vellykket. De Resultatet av beregningen er tilgjengelig i denne tilstanden.

    I tilfelle asynkron beregning mislykkes, de Love objektet beveger seg til avvist Stat fra begynnelsen i påvente av stat. I denne tilstanden, den grunnen til beregningsfeilen (dvs. feilmelding) blir gjort tilgjengelig.

    Å gå fra i påvente av til oppfylt stat, Løse() er kalt. Å gå fra i påvente av til avvist stat, avvise () er kalt.

    De deretter og å fange fremgangsmåter

    Når staten endringer fra i påvente av til oppfylt, hendelseshåndterer av Love objektets deretter metode er utført. Og når staten endringer fra i påvente av til avvist, hendelseshåndterer av Love objektets å fange metode er utført.

    Eksempel 1

    “Ikke-Promisified” kode

    Anta at det er en hello.txt fil som inneholder “Hallo” ord. Slik kan vi skrive en AJAX-forespørsel til hente den filen og vis innholdet, uten å bruke Love gjenstand:

     funksjon getTxt () la xhr = ny XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ( 'text / plain'); xhr.send (); xhr.onload = function () prøv switch (this.status) case 200: document.write (this.response); gå i stykker; tilfelle 404: kaste 'fil ikke funnet'; standard: kaste 'Kunne ikke hente filen';  catch (err) console.log (err);  getTxt (); 

    Hvis innholdet i filen har vært vellykket hentet, dvs. svarstatuskoden er 200, svarteksten er skrevet inn i dokumentet. Hvis filen er ikke funnet (status 404), en “Fil ikke funnet” feilmelding kastes. Ellers a generell feilmelding Det angis at feilen i hentingen av filen er kastet.

    “Promisified” kode

    La oss nå Promisifiser koden ovenfor:

     funksjon getTxt () return new Promise (funksjon (løs, avvis) la xhr = ny XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) tilfelle 200: løse (this.response); tilfelle 404: avvise ('Fil ikke funnet'); standard: avvis hente filen ');;);  getTxt (). deretter (funksjon (txt) document.write (txt);). catch (funksjon (err) console.log (err);); 

    De getTxt () funksjonen er nå kodet til returnere en ny forekomst av Love gjenstand, og dens eksekveringsfunksjon holder den asynkrone koden fra før.

    Når svarstatuskode er 200, de Love er oppfylt av ringer Løse() (svaret er bestått som parameter for Løse()). Når statuskoden er 404 eller noe annet, vil Love er avvist ved hjelp av avvise () (med riktig feilmelding som parameter for avvise ()).

    De hendelseshåndterer for deretter() og å fange() fremgangsmåter av Love objekt er lagt til på slutten.

    Når Love er oppfylt, håndterer av deretter() metoden kjøres. Dets argument er parameteren gikk fra Løse(). Inne i hendelsesbehandleren er svarteksten (mottatt som argumentet) skrevet inn i dokumentet.

    Når Love er avvist, hendelseshåndterer av å fange() metoden kjøres, logger feilen.

    De hovedfordel av ovennevnte Promisified versjon av koden er feilhåndtering. I stedet for å kaste Uncaught Unntak rundt - som i den ikke-Promisified versjonen - The passende feilmeldinger returneres og logges.

    Men det er ikke bare retur av feilmeldinger men også av Resultatet av den asynkrone beregningen som kan være virkelig fordelaktig for oss. For å se det, må vi utvide vårt eksempel.

    Eksempel 2

    “Ikke-Promisified” kode

    I stedet for bare å vise teksten fra hello.txt, Jeg vil kombinere den med “Verden” ord og vis den på skjermen etter en time-out på 2 sekunder. Her er koden jeg bruker:

     funksjon getTxt () la xhr = ny XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ( 'text / plain'); xhr.send (); xhr.onload = function () prøv switch (this.status) case 200: document.write (concatTxt (this.response)); gå i stykker; tilfelle 404: kaste 'fil ikke funnet'; standard: kaste 'Kunne ikke hente filen';  catch (err) console.log (err);  funksjon concatTxt (res) setTimeout (funksjon () return (res + 'World'), 2000);  getTxt (); 

    På statuskoden 200, er concatTxt () funksjonen kalles til sammenkoble svarteksten med “Verden” ord før du skriver det inn i dokumentet.

    Men denne koden vil ikke fungere som ønsket. De setTimeout () tilbakeringingsfunksjon kan ikke returnere den sammenkædede strengen. Det som skal skrives ut til dokumentet, er udefinert fordi det er hva concatTxt () avkastning.

    “Promisified” kode

    Så, for å få koden til å fungere, la oss Promisifiser koden ovenfor, gjelder også concatTxt ():

     funksjon getTxt () return new Promise (funksjon (løs, avvis) la xhr = ny XMLHttpRequest (); xhr.open ('GET', 'hello.txt'); xhr.overrideMimeType ('text / plain'); xhr.send (); xhr.onload = function () switch (this.status) tilfelle 200: løse (this.response); tilfelle 404: avvise ('Fil ikke funnet'); standard: avvis hente filen ');;);  funksjon concatTxt (txt) return new Promise (funksjon (løse, avvise) setTimeout (function () resolve (txt + 'World');, 2000););  getTxt (). da ((txt) => return concatTxt (txt);) .Til ((txt) => document.write (txt);) .fangst ((err) => konsoll. logg (feil);); 

    Akkurat som getTxt (), de concatTxt () funksjon også returnerer en ny Love gjenstand i stedet for den sammenkalte teksten. De Love returnert av concatTxt () er løst innen tilbakeringingsfunksjon av setTimeout ().

    Nær slutten av den ovennevnte koden, hendelsen handler av den første deretter() Metoden kjører når Love av getTxt () er oppfylt, dvs. når filen er hentet vellykket. Inne i den håndteringen, concatTxt () er kalt og Love returnert av concatTxt () returneres.

    Hendelsen handler av den andre deretter() Metoden kjører når Love returnert av concatTxt () er oppfylt, dvs. to sekunder time-out er over og Løse() er kalt med den sammenkædede strengen som dens parameter.

    Endelig, å fange() fanger alle unntak og feilmeldinger fra begge løftene.

    I denne Promisified versjonen, the “Hei Verden” streng vil være vellykket utskrift til dokumentet.