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 esteOK
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.