Cerințe: Proiectul trebuie să convertească Observables în Promises și să aștepte finalizarea, iar când se folosește metoda toPromise() într-un proiect Angular, hint-ul a fost deprevăzut, iar apoi se recomandă utilizarea metodelor statice firstValueFrom sau lastValueFrom.
De ce să renunți la metoda toPromise()?
Pentru că numele metodei toPromise() nu indică niciodată ce valoare emisă va rezolva Promisiunea, deoarece Observabilele pot produce multiple valori în timp. Când convertești într-o Promisiune, poate vrei să alegi dacă vrei să alegi prima valoare care sosește sau ultima valoare. Pentru a rezolva toate aceste probleme, am decis să renunțăm la toPromise() și să introducem două noi funcții auxiliare pentru conversia în promisiuni.
Pur și simplu înțelegeObservabilele produc valori multipleApoiPromisiunile vor duce la o singură valoareApoi, unii utilizatori vor să folosească prima valoare, iar alții vor să folosească ultima valoare, astfel încât apar firstValueFrom și lastValueFrom. (Notă: toPromise() este ultima valoare pentru a obține observabilele)
exemplul firstValueFrom
Poate vrei să obții prima valoare când sosește fără să aștepți completarea Observable-ului, ca să poți folosi firstValueFrom. firstValueFrom va rezolva Promisiunea cu prima valoare emisă de Observabil și se va dezabona imediat pentru a păstra resursa. Dacă Observabilul se completează fără a emite vreo valoare, primulValueFrom va fi, de asemenea, respins cu un VidtyError.
exemplu lastValueFrom
lastValueFrom este aproape identic cu toPromise(), ceea ce înseamnă că va analiza cu ultima valoare atinsă când Observabilul se termină, dar se comportă diferit când Observabilul se încheie fără a emite nicio valoare. Când Observabilul se finalizează fără a fi lansat, toPromise() va rezolva cu succes în undefined (deci tipul de returnare se schimbă), iar lastValueFrom va fi respins ca VidtyError. Prin urmare, tipul de returnare al lastValueFrom este Promise<T>, la fel ca toPromise() în RxJS 6.
Exemple de analiză sintonizată
În RxJS, interval(1000) generează un observabil care emite o secvență incrementală de numere la fiecare 1000 de milisecunde (adică 1 secundă), începând de la 0.
Apoi, .pipe(take(10)) este un lanț de operatori care limitează numărul de elemente pe care Observabilul le emite. Aici, take(10) înseamnă că doar valorile primelor 10 emise sunt luate.
Să explicăm această expresie în detaliu:
interval(1000): Creează un observabil care emite un număr la fiecare 1 secundă. Secvența numerică începe de la 0 și crește cu 1 de fiecare dată.
.pipe(take(10)): Folosește metoda .pipe() pentru a conecta mai mulți operatori. Aici folosim operatorul take(10), care limitează Observabilul să emită doar primele 10 valori.
Testează erorile EmptyError
Codul este următorul:
sau
Referință:Autentificarea cu hyperlink este vizibilă. |