Zahteve: Projekt mora pretvoriti Observables v Promises in počakati na dokončanje, pri uporabi metode toPromise() v Angular projektu pa je namig že zastarel, nato pa je priporočljivo uporabiti statične metode firstValueFrom ali lastValueFrom.
Zakaj ukiniti metodo toPromise()?
Ker ime metode toPromise() nikoli ne pove, katero oddano vrednost bo Oblise razrešila, saj lahko Observables skozi čas proizvedejo več vrednosti. Pri pretvorbi v obljubo boste morda želeli izbrati, ali želite izbrati prvo ali zadnjo vrednost. Da bi rešili vse te težave, smo se odločili, da ukinemo toPromise() in uvedemo dve novi pomožni funkciji za pretvorbo v promise.
Preprosto razumiteOpazljive vrednosti proizvajajo več vrednostiIn potemObljube bodo prinesle le eno vrednostNato nekateri uporabniki želijo uporabiti prvo vrednost, drugi pa zadnjo, zato se prikažeta firstValueFrom in lastValueFrom. (Opomba: toPromise() je zadnja vrednost, ki dobi opazljive vrednosti)
firstValueFrom primer
Morda boste želeli dobiti prvo vrednost, ko prispe, brez čakanja, da se Observable zaključi, zato lahko uporabite firstValueFrom. firstValueFrom bo razrešil Promise s prvo vrednostjo, ki jo odda Observable, in se takoj odjavil, da ohrani vir. Če Observable dokonča brez oddaje kakršnekoli vrednosti, bo firstValueFrom prav tako zavrnjen z EmptyError.
lastValueFrom primer
lastValueFrom je skoraj identičen s toPromise(), kar pomeni, da bo analiziral z zadnjo vrednostjo, doseženo ob dokončanju Opazljivega objekta, vendar se obnaša drugače, ko se Opazljiv dokonča brez oddajanja ene same vrednosti. Ko se Observable zaključi brez sprožitve, se toPromise() uspešno razreši kot nedefinirano (torej se tip vrnitve spremeni), lastValueFrom pa bo zavrnjen kot EmptyError. Zato je tip return lastValueFrom Promise<T>, podobno kot toPromise() v RxJS 6.
Primer razčlenjevanja
V RxJS interval(1000) generira opazovalko, ki vsakih 1000 milisekund (tj. 1 sekundo) oddaja inkrementalno zaporedje števil, začenši pri 0.
Nato je .pipe(take(10)) veriga operatorjev, ki omejuje število elementov, ki jih Observable oddaja. Tukaj take(10) pomeni, da se vzamejo le vrednosti prvih 10 oddaj.
Pojasnimo ta izraz podrobno:
interval(1000): Ustvari opazovalko, ki vsakih 1 sekundo oddaja številko. Zaporedje števil se začne pri 0 in se vsakič poveča za 1.
.pipe(take(10)): Uporabite metodo .pipe() za povezavo več operatorjev. Tukaj uporabimo operator take(10), ki omeji Observable, da oddaja le prvih 10 vrednosti.
Testirajte za napake EmptyError
Koda je naslednja:
ali
Referenčni:Prijava do hiperpovezave je vidna. |