Forstå JavaScript Løfter

Introduksjon til lover

Et løfte er vanligvis definert som en proxy for en verdi som etter hvert vil bli tilgjengelig.

Løftene er en måte å håndtere asynkron kode, uten å bli sittende fast i innb. helvete.

Lover har blitt en del av språket i år (standardisert og innført i ES2015), og har nylig blitt mer integrert, med asynkron og venter i ES2017.,

Asynkron funksjoner bruker løfter bak kulissene, så det å forstå hvordan løfter arbeid er grunnleggende for å forstå hvordan async og await arbeid.

Hvordan lover virker, i kort

Når et løfte som har blitt kalt, det vil begynne i en ventende staten. Dette betyr at den som ringer funksjonen fortsetter å utføre, mens løftet er satt på vent inntil det løser, noe som gir kalle funksjonen hva data ble bedt om.,

laget løftet vil til slutt ende i et løst staten, eller i en avslått tilstand, kaller de respektive callback-funksjoner (som sendes til then og catch) ved etterbehandling.

Som JS Api bruk løfter?

I tillegg til din egen kode og kode biblioteker, lover er brukt av standard moderne Web-Api-er for eksempel:

  • Batteriet API
  • Hent API
  • Service Medarbeidere

Det er lite sannsynlig at i moderne JavaScript vil du finne deg selv ikke bruker løftene, så la oss begynne å dykke rett inn i dem.,

Opprette et løfte

Løftet API-en inneholder et Løfte constructor, som du initialisere ved hjelp av new Promise():

Som du kan se, løftet sjekker done global konstant, og hvis det er sant, løftet går til et løst state (siden resolve innb. ble kalt), ellers, reject tilbakering er utført, setter den lover i avslått tilstand., (Hvis ingen av disse funksjonene kalles i utførelsen banen, løftet, vil forbli i en ventende staten)

ved Hjelp av resolve og reject, vi kan kommunisere tilbake til den som ringer hva den resulterende løfte staten var, og hva skal gjøre med det. I ovennevnte sak vi har nettopp returnert en streng, men det kan være et objekt, eller null så godt. Fordi vi har laget løftet i ovennevnte utdrag, det har allerede begynt å utføre. Dette er viktig for å forstå hva som foregår i den delen som Forbruker et løfte nedenfor.,

En mer vanlig eksempel kan du komme over, er en teknikk kalt Promisifying. Denne teknikken er en måte å være i stand til å bruke en klassisk JavaScript-funksjon som tar en tilbakeringing, og ha den tilbake et løfte:

I de siste versjoner av Noden.js, du slipper å gjøre dette manuelt konvertering for mye av API. Det er en promisifying funksjonen tilgjengelig i util-modul som vil gjøre dette for deg, gitt at den funksjonen du er promisifying har riktig signatur.,

Forbruker et løfte

I den siste delen, vi introdusert hvordan et løfte er opprettet.

la oss Nå se hvordan lover som kan brukes eller brukes.

å Kjøre checkIfItsDone() vil angi funksjoner som skal utføres når isItDoneYet løfte løser (i then anrop) eller avviser (i catch ring til).

Kjeding løfter

Et løfte kan returneres til et annet løfte, å lage en kjede av lover.,

Et flott eksempel på kjeding lover er Henta API, som vi kan bruke til å få et ressurs-og kø i en kjede av lover å utføre når ressursen er hentet.

Hent API er et løfte-basert mekanisme, og ringer fetch() er det samme som å definere våre egne lover ved hjelp av new Promise().

Eksempel på kjeding løfter

I dette eksemplet, vi kaller fetch() for å få en liste over TODO elementer fra todos.json fil som finnes i domenet rot, og vi lage en kjede av lover.,

å Kjøre fetch() returnerer et svar, som har mange egenskaper, og i løpet av de vi referanse:

  • status, en numerisk verdi som representerer HTTP status code
  • statusText, en status-melding, som er OK hvis forespørselen er vellykket

response også har en json() metode som returnerer et løfte som vil løse med innhold av kroppen behandles og forvandlet til JSON.,

Så gitt disse forutsetningene, er dette er hva som skjer: det første løftet i kjeden er en funksjon som vi definert, kalt status(), som sjekker svar status og hvis det ikke er en suksess svar (mellom 200 og 299), det avviser løftet.

Denne operasjonen vil føre løftet kjede til å hoppe over alle lenket lover notert og vil hoppe direkte til catch() uttalelse på bunnen, logging Request failed tekst sammen med feilmelding.,

Hvis det lykkes i stedet, det kaller json() funksjon vi definert. Siden forrige løfte, når vellykket, returneres response objekt, får vi det som en inngang til andre lover.

I dette tilfellet, vi returnerer JSON-data behandles, så det tredje løftet får JSON direkte:

.then((data) => { console.log('Request succeeded with JSON response', data)})

vi bare logge den til konsollen.

Håndtering av feil på

I eksempelet i forrige avsnitt, vi hadde en catch som ble lagt til kjeden av lover.,

Når noe i kjeden av løfter svikter og reiser en feil eller avviser lover, kontroll går til nærmeste catch() uttalelse nedover i kjeden.

Gjennomgripende feil

Hvis inni catch() du heve en feil, kan du legge til et sekund catch() for å håndtere det, og så videre.

new Promise((resolve, reject) => { throw new Error('Error')}) .catch(err => { throw new Error('Error') }) .catch(err => { console.error(err) })

Iscenesetter løfter

Løfte.,alle()

Hvis du trenger å synkronisere forskjellige lover, Promise.all() hjelper deg med å definere en liste over lover, og gjennomføre noe når de er løst.

Eksempel:

ES2015 destructuring oppdrag syntaks kan du også gjøre

Promise.all().then(() => { console.log('Results', res1, res2)})

Du er ikke begrenset til, bruk av fetch selvfølgelig, noen lover kan brukes på denne måten.

Løfte.,race()

Promise.race() kjører når den første av de løfter du passerer det løser, og det går festet innb. bare en gang, med det resultat av det første løftet løst.,

Eksempel:

Vanlige feil

Uncaught TypeError: udefinert er ikke et løfte

Hvis du får Uncaught TypeError: undefined is not a promise feil i konsollen, sørg for at du bruker new Promise() i stedet for bare Promise()

UnhandledPromiseRejectionWarning

Dette betyr at et løfte du kalt avvist, men det var ingen catch brukes til å håndtere feil. Legge til en catch etter den fornærmende then for å håndtere dette riktig.

Share

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *