no.hideout-lastation.com
Paradis For Designere Og Utviklere


Komme i gang med JavaScript-løfter

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

Dermed tar de ikke bare vår evne til å kontrollere utførelsen av funksjonen, men gjør også feilhåndtering litt av et problem. Dette er hvor Promise objektet kommer inn, da det tar sikte på å fylle ut noen av potholes i asynkron koding .

Promise er teknisk et standard internt objekt i JavaScript, noe som betyr at den kommer innebygd i JavaScript . Det brukes til å representere det endelige resultatet av en asynkron kodeblokk (eller grunnen til at koden mislyktes) og har metoder for å kontrollere utførelsen av den asynkrone koden .

syntax

Vi kan opprette en forekomst av Promise objektet ved hjelp av det new søkeordet:

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

Funksjonen som er bestått som en parameter til Promise() -konstruktøren er kjent som eksekutor . Den har asynkron kode og har to parametere av Function, referert til som resolve og reject funksjoner (mer om disse kort tid).

Stater av Promise objektet

Den opprinnelige tilstanden til et Promise objekt kalles ventende . I denne tilstanden finnes ikke resultatet av den asynkrone beregningen.

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

Hvis den asynkrone beregningen mislykkes, flytter Promise objektet til den avviste tilstanden fra den første ventende tilstanden. I denne tilstanden er årsaken til beregningsfeilen (dvs. feilmelding) gjort tilgjengelig.

For å gå fra ventende til oppfylt tilstand, kalles resolve() . For å gå fra ventende til avvist tilstand, blir reject() kalt .

then og catch

Når staten endrer seg fra ventende til oppfyllelse, utføres hendelsesbehandleren av Promise objektet then metoden . Og når staten endres fra ventende å avvises, blir hendelseshåndteringen av Promise objektets catch utført.

Eksempel 1

"Ikke-Promisified" -kode

Anta at det er en hello.txt fil som inneholder "Hei" hello.txt . Slik kan vi skrive en AJAX-forespørsel for å hente den filen og vise innholdet, uten å bruke Promise objektet:

 funksjon getTxt () {la xhr = ny XMLHttpRequest (); xhr.open ('GET', 'hei.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 blitt hentet, dvs. svarstatuskoden er 200, skrives svarteksten inn i dokumentet . Hvis filen ikke ble funnet (status 404), blir en "Fil ikke funnet" feilmelding kastet. Ellers kastes en generell feilmelding som angir feilen i hentingen av filen.

"Promisified" -kode

Nå, la oss Promisify den ovennevnte koden :

 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);}); 

getTxt() -funksjonen er nå kodet for å returnere en ny forekomst av Promise objektet, og dens eksekveringsfunksjon holder den asynkrone koden fra før.

Når svarstatuskoden er 200, er Promise oppfylt ved å ringe resolve() (svaret er bestått som parameter for resolve() ). Når statuskoden er 404 eller noe annet, blir Promise avvist ved å bruke reject() (med den riktige feilmeldingen som parameter for reject() ).

Hendelsesbehandlerne for then() og catch() -metodene til Promise objektet blir lagt til på slutten .

Når Promise er oppfylt, blir håndteringen av den then() -metoden kjørt. Argumentet er parameteren bestått fra resolve() . Innenfor hendelseshåndtereren blir svarteksten (mottatt som argumentet) skrevet inn i dokumentet .

Når Promise avvises, kjøres hendelseshåndteringen av catch(), logger feilen .

Den største fordelen med den overordnede Promisified versjonen av koden er feilhåndteringen . I stedet for å kaste Uncaught Unntak rundt - som i den ikke-Promisified versjonen - blir de riktige feilmeldingene returnert og logget.

Men det er ikke bare retur av feilmeldingene, men også resultatet av asynkron beregning 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, vil jeg kombinere den med "World" hello.txt og vise det på skjermen etter en hello.txt av 2 sekunder . Her er koden jeg bruker:

 funksjon getTxt () {la xhr = ny XMLHttpRequest (); xhr.open ('GET', 'hei.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 kalles concatTxt() -funksjonen for å sammenkalle svarteksten med "World" concatTxt() før du skriver det inn i dokumentet.

Men denne koden vil ikke fungere som ønsket . setTimeout() kan ikke returnere den sammenkædede strengen . Det som blir skrevet ut til dokumentet, er undefined fordi det er hva concatTxt() returnerer .

"Promisified" -kode

Så, for å få koden til å virke, la oss Promisifisere koden ovenfor, inkludert 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 (). deretter ((txt) => {return concatTxt (txt);}) .Til ((txt) => {document.write (txt);}) .fang ((err) => {konsoll. logg (feil);}); 

På samme måte som getTxt(), concatTxt() -funksjonen også et nytt Promise objekt i stedet for den sammenkalte teksten. Promise returnert av concatTxt() er løst innen tilbakeringingsfunksjonen av setTimeout() .

Ved slutten av den ovennevnte koden kjører hendelseshåndteringen av den første then() -metoden når Promise om getTxt() er oppfylt, dvs. når filen hentes vellykket . Inne i den handler concatTxt() og Promise returneres av concatTxt() returneres .

Hendelsesbehandleren av den andre then() -metoden kjører når Promise returnert av concatTxt() er oppfylt, det vil si at to sekunder- concatTxt() er over og resolve() kalles med den sammenkædede strengen som dens parameter.

Til slutt catch() alle unntakene og feilmeldingene fra begge løftene.

I denne Promisified versjonen vil "Hello World" -strengen bli skrevet ut til dokumentet.

Slik kobler du skrivebordstastatur til Android-enhet

Slik kobler du skrivebordstastatur til Android-enhet

Touch-skriving kan være morsomt, men alternativene dine er fortsatt litt begrenset i forhold til å skrive på et fysisk tastatur - det vi bruker med PC. Men vent, hva med om du kan koble skrivebordstastaturet ditt med smarttelefonen eller nettbrettet ditt?Ja, du kan koble et fysisk tastatur i full størrelse til Android-enheten din, og i dette innlegget vil jeg vise deg 3 forskjellige måter hvordan du gjør nettopp det. La o

(Tekniske og design tips)

12 Cool ideer for å resirkulere gamle Android-enheter

12 Cool ideer for å resirkulere gamle Android-enheter

Statistikk hevder at de fleste mennesker oppgraderer sine smarttelefoner eller nettbrettene en gang hvert annet år i USA. Selv om det samme ikke gjelder for deg, men de fleste oppgraderer sine enheter til enhver tid. Men spørsmålet er, hva gjør du med din gamle Android-enhet da?Du kan bytte ut din gamle Android-enhet, gave eller donere den, eller bare holde den et sted i ditt hjem. Me

(Tekniske og design tips)