Krav: Prosjektet må konvertere Observables til Promises og vente på ferdigstillelse, og når toPromise()-metoden brukes i et Angular-prosjekt, er hintet foreldet, og da anbefales det å bruke de statiske metodene firstValueFrom eller lastValueFrom.
Hvorfor avvikle toPromise()-metoden?
Fordi navnet på toPromise()-metoden aldri angir hvilken emittert verdi Promise vil løse, fordi Observables kan produsere flere verdier over tid. Når du konverterer til et Løfte, kan det være lurt å velge om du vil velge den første verdien som kommer eller den siste verdien. For å løse alle disse problemene bestemte vi oss for å avvikle toPromise() og introdusere to nye hjelpefunksjoner for konvertering til promises.
Bare forståObservabler produserer flere verdierOg såLøfter vil bare resultere i én verdiDeretter vil noen brukere bruke den første verdien, og noen vil bruke den siste verdien, så firstValueFrom og lastValueFrom vises. (Merk: toPromise() er den siste verdien som henter observablene)
firstValueFrom-eksempel
Du kan ønske å få den første verdien når den ankommer uten å vente på at Observablen skal fullføres, slik at du kan bruke firstValueFrom. firstValueFrom vil løse Promise med den første verdien som Observablen utsender og umiddelbart avslutte abonnementet for å bevare ressursen. Hvis Observablen fullføres uten å sende ut noen verdi, vil også firstValueFrom bli avvist med en EmptyError.
lastValueFrom-eksempel
lastValueFrom er nesten identisk med toPromise(), noe som betyr at den vil analysere med den siste verdien som nås når observablen fullføres, men oppfører seg annerledes når observablen fullføres uten å sende ut en eneste verdi. Når Observablen fullføres uten å bli avfyrt, vil toPromise() lykkes med å løses til udefinert (slik at returtypen endres), og lastValueFrom vil bli avvist som EmptyError. Derfor er returtypen til lastValueFrom Promise<T>, akkurat som toPromise() i RxJS 6.
Eksempel på parsing
I RxJS genererer interval(1000) en observabel som sender ut en inkrementell sekvens av tall hvert 1000 millisekund (dvs. 1 sekund), med start fra 0.
Deretter er .pipe(take(10)) en operatorkjede som begrenser antall elementer observablen sender ut. Her betyr take(10) at kun verdiene til de første 10 som sendes ut, tas.
La oss forklare dette uttrykket i detalj:
interval(1000): Lag en observabel som sender ut et tall hvert 1. sekund. Tallsekvensen starter på 0 og øker med 1 hver gang.
.pipe(take(10)): Bruk .pipe()-metoden for å koble sammen flere operatorer. Her bruker vi take(10)-operatoren, som begrenser observablen til kun å sende ut de første 10 verdiene.
Test for EmptyError-feil
Koden er som følger:
eller
Referanse:Innloggingen med hyperkoblingen er synlig. |