Vaatimukset: Projektin täytyy muuntaa Observablesit Promisesiksi ja odottaa niiden valmistumista, ja kun käytetään toPromise()-metodia Angular-projektissa, vihje on poistettu käytöstä, minkä jälkeen suositellaan käyttämään firstValueFrom- tai lastValueFrom-metodeja.
Miksi hylätä toPromise()-menetelmä?
Koska toPromise()-metodin nimi ei koskaan kerro, minkä emittoiman arvon lupaus ratkaisee, koska havaittavat tiedostot voivat tuottaa useita arvoja ajan kuluessa. Kun muunnat lupaukseksi, saatat haluta valita, haluatko valita ensimmäisen saapuvan arvon vai viimeisen arvon. Ratkaistaksemme kaikki nämä ongelmat päätimme poistaa toPromise():n käytöstä ja ottaa käyttöön kaksi uutta apufunktiota lupauksiksi muuntamiseen.
Yksinkertaisesti ymmärräHavaittavat tuotteet tuottavat useita arvojaSittenLupaukset johtavat vain yhteen arvoonSitten jotkut käyttäjät haluavat käyttää ensimmäistä arvoa, toiset viimeistä arvoa, jolloin firstValueFrom ja lastValueFrom ilmestyvät. (Huomautus: toPromise() on viimeinen arvo, jolla saadaan havaittavat arvot)
firstValueFrom-esimerkki
Saatat haluta saada ensimmäisen arvon heti kun se saapuu odottamatta Observablen valmistumista, jotta voit käyttää firstValueFromia. firstValueFrom ratkaisee lupauksen ensimmäisellä Observablen lähettämällä arvolla ja peruuttaa tilauksen välittömästi resurssin säilyttämiseksi. Jos Observable valmistuu ilman arvoa, firstValueFrom hylätään myös EmptyErrorilla.
lastValueEsimerkistä
lastValueFrom on lähes identtinen toPromise():n kanssa, mikä tarkoittaa, että se jäsentää viimeisimmän arvon mukaan, kun Observable valmistuu, mutta käyttäytyy eri tavalla, kun Observable valmistuu ilman yhtäkään arvoa. Kun Observable valmistuu ilman laukaisua, toPromise() ratkeaa onnistuneesti määrittelemättömäksi (jolloin palautustyyppi muuttuu), ja lastValueFrom hylätään EmptyErrorina. Siksi lastValueFrom-palautustyyppi on Promise<T>, aivan kuten toPromise() RxJS 6:ssa.
Esimerkki jäsentämisestä
RxJS:ssä interval(1000) tuottaa havaittavan jonon, joka lähettää lukujonon joka 1000 millisekunti (eli 1 sekunti), alkaen nollasta.
Seuraavaksi .pipe(take(10)) on operaattoriketju, joka rajoittaa Observablen lähettämien alkioiden määrää. Tässä take(10) tarkoittaa, että otetaan vain ensimmäisten 10 lähetetyn arvoa.
Selitetäänpä tämä ilmaus yksityiskohtaisesti:
interval(1000): Luo havaittava, joka lähettää luvun joka sekunti. Lukujono alkaa nollasta ja kasvaa yhdellä.
.pipe(take(10)): Käytä .pipe()-menetelmää yhdistääksesi useita operaattoreita. Tässä käytämme take(10)-operaattoria, joka rajoittaa Observablen lähettämään vain ensimmäiset 10 arvoa.
Testaa EmptyError-virheitä
Koodi on seuraava:
tai
Viittaus:Hyperlinkin kirjautuminen on näkyvissä. |