Požiadavky: Projekt musí konvertovať Observables na Promises a počkať na dokončenie, a pri použití metódy toPromise() v Angular projekte je nápoveda zastaraná, a potom sa odporúča použiť statické metódy firstValueFrom alebo lastValueFrom.
Prečo odmietať metódu toPromise()?
Pretože názov metódy toPromise() nikdy neuvádza, ktorú vydanú hodnotu sa Promise vyrieši, pretože Observables môžu v čase produkovať viacero hodnôt. Pri konverzii na sľub možno budete chcieť vybrať, či chcete zvoliť prvú alebo poslednú hodnotu. Aby sme vyriešili všetky tieto problémy, rozhodli sme sa zrušiť toPromise() a zaviesť dve nové pomocné funkcie na konverziu na promise.
Jednoducho pochoptePozorovateľné veličiny produkujú viacero hodnôtA potomSľuby prinesú len jednu hodnotuPotom niektorí používatelia chcú použiť prvú hodnotu, iní poslednú, takže sa zobrazia firstValueFrom a lastValueFrom. (Poznámka: toPromise() je posledná hodnota, ktorá získa pozorovateľné veličiny.)
firstValueFrom príklad
Možno budete chcieť získať prvú hodnotu, keď príde, bez čakania na dokončenie Observable, takže môžete použiť firstValueFrom. firstValueFrom vyrieši Promise prvou hodnotou emitovanou Observable a okamžite sa odhlási, aby zachoval zdroj. Ak Observable dokončí bez vydania akejkoľvek hodnoty, firstValueFrom bude tiež odmietnutý s EmptyError.
lastValueFrom príklad
lastValueFrom je takmer identická s toPromise(), čo znamená, že bude parsovať s poslednou hodnotou dosiahnutou pri dokončení Observable, ale správa sa inak, keď Observable dokončí bez vydania jedinej hodnoty. Keď sa Observable dokončí bez spustenia, toPromise() sa úspešne vyrieši na undefined (takže sa mení typ návratu) a lastValueFrom bude odmietnutý ako EmptyError. Preto return typ lastValueFrom je Promise<T>, rovnako ako toPromise() v RxJS 6.
Príklad parsovania
V RxJS interval(1000) generuje pozorovateľnú veličinu, ktorá každých 1000 milisekúnd (t. j. 1 sekundu) generuje postupnosť čísel, začínajúc na 0.
Ďalej, .pipe(take(10)) je reťazec operátorov, ktorý obmedzuje počet prvkov, ktoré Observable vyžaruje. Tu take(10) znamená, že sa berú len hodnoty prvých 10 vydaných.
Vysvetlime tento výraz podrobne:
interval(1000): Vytvorte pozorovateľnú veličinu, ktorá každú 1 sekundu vyžaruje číslo. Číselná sekvencia začína na 0 a zakaždým rastie o 1.
.pipe(take(10)): Použite metódu .pipe() na prepojenie viacerých operátorov. Tu používame operátor take(10), ktorý obmedzuje Observable na vyžarovanie iba prvých 10 hodnôt.
Test na chyby EmptyError
Kód je nasledovný:
alebo
Referencia:Prihlásenie na hypertextový odkaz je viditeľné. |