rkjs opskrifter: ‘forkJoin’ med fremskridt med færdiggørelse af anmodninger om bulk-netværk i Angular

som det ofte sker for mig-dette indlæg er bare en forlængelse af min Stackoverløbsaktivitet: -).

spørgsmål:

er der en måde at samle en liste over observerbare sammen for at få kumulativt resultat som forkJoin gør, men få en slags fremskridt, mens de er færdige?

en dejlig opgave til oprettelse af brugerdefineret Rksj-funktion. Lad os implementere det!

lad os se på officiel dokumentation:

forkJoin(…kilder: enhver): observerbar<enhver>

accepterer en Array af ObservableInput eller en ordbog Object af ObservableInput og returnerer en Observable, der udsender enten en række værdier i nøjagtig samme rækkefølge som det beståede array, eller en ordbog med værdier i samme form som den beståede ordbog.

med andre ord fungerer forkJoin for observerbare på samme måde som Promise.alle arbejder for løfter.

her er et marmor diagram:

den mulige use-case for det kører mange parallelle netværk anmodninger-for eksempel hente nogle usersList detaljer (hvis API understøtter kun per bruger hente).

her er et eksempel:

snippet link

her er et codepen link til at lege med.
det virker fint, men hvad nu hvis vi har brug for at vide nogle mellemliggende oplysninger som hvor mange anmodninger er løst allerede? Med den nuværende forkJoin-implementering er det umuligt, men vi kan oprette vores egen version af det ?.
OK, så kort dagsorden, hvordan denne gaffelforbindelse med procent skal fungere:
udgang:
1. Det returnerer højere orden(HO) observerbar (), der udsender en række to observerbare: .

<>kopi
*Higher-order (HO) Observable - observable that emits other observables, so data flow should be handled with special flattening operators like mergeMap, switchMap, concatMap, etc... you can read more about it here and here.

2. procent$ – udsender procentdel af færdiggørelse (nummer);
3. finalresultat$ – udsender en endelig række værdier i slutningen (eller fejl, hvis noget argument observerbart udsender fejlværdi).
foreløbigt brug ser sådan ud:

uddrag link

implementeringsdetaljer:

  1. vores gaffelforbindelse med fremskridtsfunktion accepterer en række observerbare og skal returnere højere ordens observerbare.
  2. denne returnerede observerbare skal udsende værdi (vi vil bruge() til det)
  3. bivirkninger vil blive tilføjet til hvert element i en række argumentobservationer for at beregne procentdelen af færdiggørelse og udsende denne værdi med speciel procent$ (vi vil bruge færdiggør operatør til procentberegning og brug emne som procent$).
  4. finalresultat$ giver standard rkjs forkJoin resultat.
  5. resultat, der kan observeres, skal fungere uafhængigt for hver abonnent (indpakningsfunktionalitet med rksj ‘ s udskydningsfunktion for at give en ren kørsel for hver abonnent — du kan læse mere om denne sag her).
  6. hvis nogle af argumentet observerbare udsender fejl — det vil blive formeret til finalresultat$ abonnenter.

Packtpub.com og jeg forberedte et helt Rksj-kursus med mange andre detaljer om, hvordan du kan løse dine daglige udvikleropgaver med dette fantastiske bibliotek. Det kan være interessant for begyndere, men indeholder også avancerede emner. Tag et kig!

implementering

#1-2 vi accepterer en vifte af observerbare og bør vende tilbage højere orden observerbar med .

Ok, bare et fodaftryk af vores fremtidige funktion:

snippet link

da vi fik arrayOfObservables (vores ajaks observerbare), så lad os gentage igen og tilføje anmodet logik:

#3 Tilføjelse af bivirkninger til argument observerbare og beregning af procentdel.

her er hvad vi har:

snippet link

vi vil tilføje mere funktionalitet til argument observerbare i array. Vi gentager over et array og anvender færdiggør operatør for hver observerbar.

færdiggør operator venter indtil specifikke observerbare fuldender, derefter beregne procentdelen af afsluttede observerbare og udsende værdi med procent$emne.

#4 Lad os ringe til forkJoin for at få en endelig resultatværdi

snipper link

Ok, lad os gå gennem denne kode:
forkJoin får en række argument observerbare, abonnerer på dem alle og venter, indtil de er færdige.
når et resultat er klar — tap operatør udsender sidste procentværdi (100%) og fuldfører procent$ emne (for at forhindre hukommelseslækager).
endelige resultater vil blive udsendt til abonnenter.

5 indpakning af al denne funktion i ‘udskyd’

Rksjs udskydningsfunktion giver ny observerbar forekomst (et resultat af dens tilbagekaldsfunktion) for hver abonnent. Det betyder, at hver af vores abonnenter vil få rent løb (og tæller = 0).

uddrag link

lad os gennemgå, hvordan det fungerer:

  1. vi får en række observerbare (line1).
  2. Indpak resultat med rksj ‘ er udsætter for at give et rent løb for hver abonnent (linje 3)
  3. Opret tæller for at beregne procentdelen af færdiggørelse og instantiere procent$ med forbehold for at udsende procentværdi (linjer 5-6).
  4. vi opretter et nyt array ved at iterere over det originale array og tilføje ny funktionalitet med færdiggør – beregning af procentværdi og udsendelse af det, hvis nogle af observerbare fuldender. (linjer 8-15)
  5. ring til forkJoin og anvend tap operator for at kunne sende procent 100, når forkJoin får et endeligt resultat. Tildel resultat til finalresultat $ variabel (linjer 17-22).
  6. returner højere ordre observerbar, der vil udsende .

at pakke op

Sådan fungerer det i en codepen:

forkjoinmed procent

hvad med at bruge det i vinkel?Link til dette afsnit

denne funktion udgives også som en npm — pakke, så du kan bruge den i dine projekter.

og her er en stackblits vinkel demo, der bruger den pakke til at fodre procentværdi for at indlæse bar:

i vinkel

yderligere læsning.

du kan læse mere om cases her:

  1. “prøv igen vs gentag”
  2. “Rksj: Managing Operator State” af Nicholas Jamieson.
  3. “rkjs ‘repeat’ operator — beginner Necromancer guide”
  4. “Throttling meddelelser fra flere brugere med Rkjs”
  5. Rkjs-toolkit — Rkjs Everyday Custom Operators af Jason Abbrey.
  6. backoff-en samling af nyttige operatører til at håndtere backoff — strategier.

kan du lide denne artikel? Lad os holde kontakten på kvidre!

startende fra afsnit 4 i min rksj video kursus fremskridt personale er gennemgået-så hvis du kender Rksj allerede — Du kan finde noget nyttigt for dig så godt: højere orden observerbare, anti-mønstre, schedulers, unit testing, etc! Giv det en chance!

* en særlig tak til Lars Gyrup Brink Nielsen, Nicholas Jamieson, Tim Deschryver og Michael kar Kurtn for at gennemgå dette indlæg og komme med mange værdifulde bemærkninger for at gøre det bedre!

Diskuter med fællesskabet

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.