Articles

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.

(promisiune.ts)

î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țiresolvefuncț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.

(tsconfig.json)

î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

thencatch ș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ăugathencatch saufinally metode la oricare dintre anteriorthencatch 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.

(promisiune-înlănțuire.ts)

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.

(promise-resolve.ts)

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.

(promisiune-respingere.ts)

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.

(promisiune-toate.ts)

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

(promise-all-reject.ts)

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

(promise-all-settled.ts)

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 despreswitch/case Garda de tip și sindicatele discriminatorii în lecția sistemului de tip.

(promise-all-settled.ts)

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.

(promisiune-rasă.ts)

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 ca Promise.race dar așteaptă până când prima promisiune se rezolvă cu succes. Această metodă aruncă o AggregateError excepție dacă toate promisiunile sunt respinse.