înțelegerea JavaScript promite

Introducere în promisiuni

o promisiune este de obicei definit ca un proxy pentru o valoare care va deveni în cele din urmă disponibile.promisiunile sunt o modalitate de a face față codului asincron, fără a se bloca în iadul de apel invers.promisiunile fac parte din limbaj de ani de zile (standardizate și introduse în ES2015) și au devenit recent mai integrate, cu async și wait în ES2017.,

Asincron funcții folosi promisiuni în spatele scenei, astfel încât înțelegerea modului de promisiuni lucru este fundamental pentru a înțelege cum async și await munca.

cum funcționează promisiunile, pe scurt

odată ce o promisiune a fost apelată, va începe într-o stare în așteptare. Aceasta înseamnă că funcția de apelare continuă să se execute, în timp ce promisiunea este în așteptare până când se rezolvă, oferind funcției de apelare orice date au fost solicitate.,

create promit că va termina în cele din urmă într-un rezolvate de stat, sau într-un respinsă de stat, de asteptare respectiv funcțiile de apel invers (a trecut la then și catch) la finisare.

ce API-uri JS folosesc promisiuni?

În plus față de propriul cod și biblioteci de cod, promisiunile sunt utilizate de către moderne standard Api-uri Web, cum ar fi:

  • Bateria API
  • Aduce API
  • Servicii Lucrătorilor

este puțin probabil că, în moderne JavaScript veți găsi te care nu folosesc promisiuni, așa că hai să începem chiar de scufundări în ele.,

Creând o promisiune

Promisiunea API expune o Promisiune constructor, care a inițializa folosind new Promise():

după Cum puteți vedea, promisiunea verifică done global constantă, și dacă e adevărat, promisiunea se duce la un rezolvate de stat (de la resolve apel invers fost numit); în caz contrar, reject apel invers este executat, punând promisiunea într-un respinsă de stat., (Dacă niciuna dintre aceste funcții este numit în calea de execuție, promisiunea va rămâne într-o stare de așteptare)

cu Ajutorul resolve și reject, putem comunica înapoi la apelantului ce rezultă promisiunea de stat a fost, și ce să facă cu ea. În cazul de mai sus tocmai am returnat un șir, dar ar putea fi un obiect sau null de asemenea. Pentru că am creat promisiunea în fragmentul de mai sus, a început deja executarea. Acest lucru este important pentru a înțelege ce se întâmplă în secțiunea consumatoare de o promisiune de mai jos.,

un exemplu mai frecvent pe care îl puteți întâlni este o tehnică numită promisiune. Aceasta tehnica este o modalitate de a fi capabil de a utiliza o funcție JavaScript clasic, care ia un apel invers, și să-l întoarcă o promisiune:

în versiunile recente ale Node.js, nu va trebui să faceți această conversie manuală pentru o mulțime de API. Există o funcție de promisiune disponibilă în modulul util care va face acest lucru pentru dvs., având în vedere că funcția pe care o promiteți are semnătura corectă.,

consumând o promisiune

În ultima secțiune, am introdus modul în care este creată o promisiune.acum, să vedem cum poate fi consumată sau folosită promisiunea.

Execută checkIfItsDone() va specifica funcții pentru a executa atunci când isItDoneYet promit rezolvă (în then call) sau de a respinge (în catch apel).o promisiune poate fi returnată unei alte promisiuni, creând un lanț de promisiuni.,

un exemplu excelent de înlănțuire a promisiunilor este API-ul Fetch, pe care îl putem folosi pentru a obține o resursă și a pune la coadă un lanț de promisiuni de executat atunci când resursa este preluată.

API-ul Fetch este un mecanism bazat pe promisiuni, iar apelarea fetch() este echivalentă cu definirea propriei noastre promisiuni folosind new Promise().în acest exemplu, apelăm fetch()pentru a obține o listă de articole TODO din fișierul todos.json găsit în rădăcina domeniului și creăm un lanț de promisiuni.,

Execută fetch() returnează un răspuns, care are mai multe proprietăți, iar în cadrul acestora avem de referință:

  • status, o valoare numerică reprezentând codul de stare HTTP
  • statusText, un mesaj de stare, care este OK dacă cererea a reușit

response are, de asemenea, un json() metodă care returnează un promite că va rezolva cu conținut ale corpului prelucrate și transformate în JSON.,

având în vedere aceste premise, aceasta este ceea ce se întâmplă: prima promisiune în lanț este o funcție care am definit, numit status(), care verifică starea de răspuns și dacă nu e un răspuns de succes (între 200 și 299), se respinge promisiunea.

Această operațiune va provoca promisiunea lanț pentru a sări peste toate legat de promisiunile enumerate și va sări direct la catch() declarație de la partea de jos, logare Request failed text, împreună cu un mesaj de eroare.,

Dacă aceasta reușește în schimb, apelează funcția json() pe care am definit-o. Deoarece promisiunea anterioară, când a avut succes, a returnat obiectul response, îl obținem ca o intrare la a doua promisiune.în acest caz, returnăm datele prelucrate de JSON, astfel încât a treia promisiune primește JSON direct:

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

și pur și simplu îl conectăm la consolă.

erori de manipulare

În exemplu, în secțiunea anterioară, am avut un catch care a fost anexat la lanțul de promisiuni.,când ceva din lanțul de promisiuni eșuează și ridică o eroare sau respinge promisiunea, controlul merge la cel mai apropiat declarație în jos lanțul.

Cascadă erori

Dacă în interiorul catch() ridica o eroare, puteți adăuga un al doilea catch() să-l ocupe, și așa mai departe.

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

orchestrarea promisiunilor

promisiune.,all ()

dacă trebuie să sincronizați diferite promisiuni, Promise.all() vă ajută să definiți o listă de promisiuni și să executați ceva atunci când toate sunt rezolvate.

Exemplu:

ES2015 destructurare atribuire sintaxa vă permite să face, de asemenea,

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

nu sunteți limitat la utilizarea fetch desigur, orice promisiune poate fi folosit în acest mod.

promisiune.,race ()

Promise.race() se execută atunci când prima dintre promisiunile pe care le treci la ea rezolvă, și se execută apel invers atașat doar o singură dată, cu rezultatul primei promisiuni rezolvate.,

Exemplu:

erori Comune

Neprins TypeError: nedefinit nu este o promisiune

Dacă ai Uncaught TypeError: undefined is not a promise eroare în consolă, asigurați-vă că utilizați new Promise() în loc de Promise()

UnhandledPromiseRejectionWarning

Acest lucru înseamnă că o promisiune ai sunat respins, dar nu a fost nici un catch folosit să se ocupe de eroare. Adauga un catch după ofensatoare then să se ocupe de acest lucru în mod corespunzător.

Share

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *