Krav: Projektet behöver konvertera Observables till Promises och vänta på slutförande, och när toPromise()-metoden används i ett Angular-projekt har hinten tagits ur värde, och då rekommenderas att använda de statiska metoderna firstValueFrom eller lastValueFrom.
Varför avveckla toPromise()-metoden?
Eftersom namnet på toPromise()-metoden aldrig anger vilket emitterat värde löftet kommer att lösas, eftersom observabler kan producera flera värden över tid. När du konverterar till ett Löfte kan du vilja välja om du vill välja det första värdet som kommer eller det sista värdet. För att lösa alla dessa problem bestämde vi oss för att avlägsna toPromise() och införa två nya hjälpfunktioner för att konvertera till promises.
Förstå helt enkeltObservabler ger flera värdenOch sedanLöften resulterar bara i ett värdeSedan vill vissa användare använda det första värdet, och andra vill använda det sista värdet, så firstValueFrom och lastValueFrom dyker upp. (Observera: toPromise() är det sista värdet som hämtar observablerna)
firstValueFrom-exempel
Du kanske vill få det första värdet när det anländer utan att vänta på att Observablen ska slutföras, så att du kan använda firstValueFrom. firstValueFrom kommer att lösa Löftet med det första värdet som Observerbaren sänder ut och omedelbart avprenumerera för att bevara resursen. Om Observablen kompletteras utan att emittera något värde, kommer firstValueFrom också att avvisas med en EmptyError.
lastValueFrom example
lastValueFrom är nästan identisk med toPromise(), vilket betyder att den kommer att tolkas med det sista värdet som nås när Observablen är komplett, men beter sig annorlunda när Observablen kompletteras utan att emittera ett enda värde. När Observablen slutförs utan att avfyras kommer toPromise() framgångsrikt att lösas till undefined (så return-typen ändras), och lastValueFrom kommer att avvisas som EmptyError. Därför är returtypen av lastValueFrom Promise<T>, precis som toPromise() i RxJS 6.
Exempel på parsning
I RxJS genererar interval(1000) en observabel som sänder en inkrementell sekvens av tal var 1000 millisekund (dvs. 1 sekund), med start från 0.
Därefter är .pipe(take(10)) en operatorkedja som begränsar antalet element som Observablen emitterar. Här betyder take(10) att endast värdena på de första 10 emitterades tas.
Låt oss förklara detta uttryck i detalj:
interval(1000): Skapa en observabel som avger ett tal var 1:e sekund. Talsekvensen börjar på 0 och ökar med 1 varje gång.
.pipe(take(10)): Använd .pipe()-metoden för att koppla ihop flera operatörer. Här använder vi take(10)-operatorn, som begränsar Observablen till att endast sända ut de första 10 värdena.
Testa för EmptyError-fel
Koden är följande:
eller
Hänvisning:Inloggningen med hyperlänken är synlig. |