o introducere rapidă la „promisiuni” și „asincron/așteaptă” (cu noi caracteristici)
o promisiune este o instanță (obiect) aPromise
clasa (constructor). Pentru a crea o promisiune, folosimnew Promise(executor)
sintaxă și oferim o funcție de executor ca argument. Această funcție de executor oferă un mijloc de a controla comportamentul rezoluției sau respingerii promisiunii noastre.
în TypeScript, putem furniza tipul de date al valorii returnate atunci când promisiunea îndeplinește. Deoarece eroarea returnată de promisiune poate lua orice formă, tipul de date implicit de valoare returnat atunci când promisiunea este respinsă este setat la any
de tipograf.
pentru a adnota tipul valorii rezoluției promisiunii, folosim o declarație de tip generic. Practic, promiteți un tip cu Promise
constructor sub forma new Promise<Type>()
care indică tipul de valoare rezolvat al promisiunii. Dar puteți utiliza, de asemenea, let p: Promise<Type> = new Promise()
sintaxă pentru a obține același lucru.
XV am discutat în detaliu clasele de generice în lecția de generice.
în exemplul de mai sus,findEven
este o promisiune care a fost creat folosindPromise
constructor care rezolvă după 1 secundă. Tipul de date rezolvat al acestei promisiuni este number
, prin urmare compilatorul TypeScript nu vă va permite să apelațiresolve
funcție cu o altă valoare decât o valoare a numărului de tipnumber
.
tipul implicit al valorii de respingere a promisiunii esteany
, prin urmare apelareareject
funcția cu orice valoare este legală. Acesta este comportamentul implicit al TypeScript și puteți găsi firul de discuție aici dacă aveți propriile opinii.
deoarece am furnizat number
ca tip de date de rezoluție promisiune de succes, compilatorul TypeScript va furniza number
tip la argumentul value
argumentul then
div > metoda de apel invers.
callback furnizat înthen
metoda este executată atunci când promisiunea este rezolvată și callback furnizat încatch
metoda este executată atunci când respinge sau unele erori în timp ce rezolvarea promisiunea. Metodafinally
înregistrează un apel invers care se execută atunci când promise rezolvă sau respinge.
dacă compilatorul TypeScript se plânge de metodafinally
, înseamnă că compilatorul TypeScript nu importă definiții de tip pentru metodafinally
. Această metodă a fost introdusă în ES2016, prin urmare este destul de nouă. Alte caracteristici ale API-ului Promise utilizate în această lecție sunt destul de noi, deci asigurați-vă că fișierul tsconfig.json
are toate bibliotecile noi încărcate.
întsconfig.json
, am încărcatES2020
biblioteca standard. Aceasta oferă suport pentru toate funcțiile JavaScript până la ES2020. Dacă doriți să aflați mai multe despre fișierul tsconfig.json
sau bibliotecile standard, vă rugăm să citiți lecția de compilare (în curând).
Promise înlănțuirea
then
catch
șifinally
metodele returnează implicit o promisiune. Orice valoare returnată de aceste funcții de apel invers este împachetată cu o promisiune și returnată, inclusiv undefined
. Această promisiune implicită este rezolvată în mod implicit, cu excepția cazului în care returnați în mod deliberat o nouă promisiune din aceste metode care ar putea eșua.
prin urmare, puteți adăugathen
catch
saufinally
metode la oricare dintre anteriorthen
catch
saufinally
metodă. Dacă o promisiune implicită este returnată prin una dintre aceste metode, atunci tipul de valoare rezolvată al acestei promisiuni implicite este tipul valorii returnate. Să vedem un exemplu rapid.
am modificat exemplul anterior și am adăugat o altă metodăthen
la prima metodăthen
. Deoarece primathen
metoda returnează o valoare de tipstring
, promisiunea implicită returnată prin această metodă va fi rezolvată cu o valoare de tipstring
. Prin urmare, a doua metodăthen
va primivalue
argument de tipstring
după cum puteți vedea din rezultate.
promisiune.rezolvați
resolve
metoda statică a apeluluiPromise
returnează o promisiune care este deja rezolvată cu succes cu o valoare pe care o furnizați în apelulPromise.resolve(value)
. Acest lucru este mai ușor decât crearea unei noi instanțe a apelului promisiunii și adăugarea logicii pentru a rezolva promisiunea imediat.
după cum puteți vedea din rezultatele de mai sus, promisiunea returnată de Promise.resolve(value)
apelul se rezolvă întotdeauna imediat cu o number
valoare de la value
argumentul are tipul de number
.
promisiune.respinge
Similar cuPromise.resolve
metoda statică,Promise.reject(error)
metoda returnează întotdeauna o promisiune respinsă. Valoarea respingerii promisiunii este preluată din argumentulerror
și tipul său este any
.
tipul promisiunii returnate dePromise.reject
metoda estePromise<never>
deoarece această promisiune nu se rezolvă niciodată, deci nu va exista nicio valoare a rezoluției promisiunii. Prin urmare, tipul valorii rezolvate de promisiune este never
ca never
semnifică valoarea care nu apare niciodată.
promisiune.toate
În unele scenarii, aveți de-a face cu mai multe promisiuni. Dacă doriți să executați o funcție de apel invers atunci când toate promisiunile sunt rezolvate cu succes, utilizați Promise.all
metoda statică.
var pAll = Promise.all()pAll.then( ( ) => {___});
Promise.all
metoda ia o matrice (iterabil precis) de promisiuni și returnează o nouă promisiune. Promisiunea returnată pAll
este rezolvată atunci când toate promisiunile p1, p2, ...
sunt rezolvate cu succes. Această promisiune este rezolvată cu o valoare de matrice care conține valorile rezoluției promisiunii p1, p2, ...
în ordinea apariției lor.
după cum puteți vedea din exemplul de mai sus,Promise.all
metoda este generică și ia tipul valoarea rezolvată de fiecare promisiune furnizată. Furnizarea unui tip generic este destul de utilă atunci când folosim valoarea rezolvată a acestei promisiuni colective, după cum puteți vedea din rezultatul de mai sus.
XV majoritatea metodelor statice ale clasei
Promise
sunt generice așa cum se demonstrează în exemplele de mai jos.
există un avertisment cu Promise.all
. Acesta implementează mecanismul fail-fast, ceea ce înseamnă că dacă oricare dintre promisiunile de intrare p1, p2, ...
sunt respinse, pAll
este respinsă. Dacă nu va aștepta pentru alte promisiuni în așteptare pentru a rezolva.
după cum puteți vedea din rezultatul de mai sus, deoarece a 3-a promisiune a fost respinsă imediat după 1 secundă, allPromise
a fost respinsă imediat.
promisiune.allSettled
Promise.allSettled
metoda statică este similară cuPromise.all
dar spre deosebire dePromise.all
, așteaptă până când toate promisiunile sunt soluționate (ceea ce înseamnă până când acestea sunt rezolvate sau respinse). Prin urmare, promisiunea returnată de Promise.allSettled
nu va respinge niciodată (dar am adăugat catch
bloc în exemplul de mai jos oricum).
lucrul cupromise.allSettled
poate fi un pic copleșitor, după cum puteți din programul de mai sus și rezultatul acestuia. În primul rând, allSettle
metoda returnează o promisiune care rezolvă cu o matrice de PromiseSettledResult<type>
valori atunci când toate promisiunile sunt decontate. type
este derivat din tipul promisiunii de intrare. TipulPromiseSettledResult
arată mai jos.
aceste tipuri sunt furnizate de biblioteca standard a lui TypeScript. Deci, atunci când o promisiune rezolvă, allSettled
metoda convertește valoarea sa în PromiseFulfilledResult
formă și atunci când nu reușește, îl convertește în PromiseRejectedResult
formă. De aceea, atunci când allSettled
este rezolvată, este o serie de obiecte în care fiecare obiect are o formă de PromiseFulfilledResult
sau PromiseRejectedResult
interfață.
Deoarece PromiseFulfilledResult
este o uniune de PromiseFulfilledResult
și PromiseRejectedResult
care are comun status
proprietatea literal tip de date, o putem folosi ca un discriminant în switch/case
paza.
XV am vorbit despre
switch/case
Garda de tip și sindicatele discriminatorii în lecția sistemului de tip.
promisiune.cursa
Promise.race
ia o matrice (iterabil precis) de promisiuni și returnează o nouă promisiune care rezolvă sau respinge de îndată ce una dintre promisiunile de intrare rezolvă sau respinge. Cu alte cuvinte, promisiunea returnată de Promise.race
este soluționată cu rezultatul uneia dintre promisiunile de intrare care se rezolvă rapid.
spre deosebire de Promise.all
sau Promise.allSettled
, această metodă returnează doar o singură valoare a primei promisiuni decontate, prin urmare, tipul promisiunii returnate este Promise<number>
în cazul de mai sus. Deoarece promisiunea 1st s-a stabilit mai întâi printre altele, then
apel invers al fastestPromise
este apelat după 500ms cu valoarea promisiunii rezolvate.
XV noua metodă
Promise.any()
a ajuns la etapa 4 a traseului propunerii ECMAScript.Promise.any
este la fel caPromise.race
dar așteaptă până când prima promisiune se rezolvă cu succes. Această metodă aruncă oAggregateError
excepție dacă toate promisiunile sunt respinse.