Redux Saga zaobchádza s viacerými súbežnými úlohami efektívnejšie ako redux Thunk predovšetkým kvôli použitiu funkcií generátora ES6 a jeho konštrukcii na zvládnutie zložitých asynchrónnych tokov deklaratívne. V Redux Saga Funkcie generátorov vytvárajú „ságy“, procesy na pozadí s dlhou životnosťou, ktoré sa môžu pozastaviť a pokračovať, čo umožňuje sofistikovanú kontrolu nad asynchrónnymi operáciami vrátane súbežnosti, zrušenia, demontovania, škrtiacej klapky a rasových podmienok. Táto schopnosť poskytuje štruktúrovaný a škálovateľný spôsob riadenia vedľajších účinkov, najmä v zložitých aplikáciách s mnohými súčasnými asynchrónnymi úlohami.
Naopak Redux Thunk je založený na jednoduchšom koncepte, ktorý zahŕňa tvorcov akcií vracajúcich sa funkcie namiesto jednoduchých akčných objektov. Tieto funkcie dokážu zvládnuť asynchrónne operácie, ako je API volania odoslaním rôznych akcií pred a po dokončení úlohy. Aj keď je pre Redux Thunk účinný pre priame alebo mierne zložité asynchrónne potreby, na základe vstavaných konštruktov na manipuláciu so súbežnou kontrolou a orchestráciou vedľajšieho účinku, čo môže viesť k kotlovejšiemu, ťažšie maintainovému kódu pri riešení mnohých prekrývajúcich sa asynchrónnych úloh.
Generátorové funkcie pre asynchrónne ovládanie
Redux Saga využíva funkcie generátora ES6, ktoré môžu priniesť kontrolu späť do middleware a čakať na dokončenie asynchrónnych operácií pred obnovením. Tento model pozastavenia a rastu umožňuje SAGAS organizovať viac úloh súbežne a paralelne s veľkou kontrolou. Napríklad ságy môžu rozvetviť viac úloh, ktoré prebiehajú nezávisle, zatiaľ čo hlavná sága pokračuje v vykonávaní. Môžu tiež pretekať úlohy, čo znamená, že jedna úloha môže zrušiť ostatných v závislosti od toho, ktorá sa dokončí ako prvá.
Táto funkcia je v kontraste s prístupom Redux Thunk, kde sa môžu asynchrónne funkcie vykonávať, ale prirodzene sa neposkytujú takejto jemnozrnnej koordinácii úloh. Thunks zvyčajne zahŕňajú hniezdne alebo reťazové sľuby a spätné volania, ktoré sa môžu stať zložitými a nepraktickými pri viacerých súbežných interakciách.
Deklaratívne riadenie vedľajších účinkov
Redux Saga používa deklaratívne účinky prostredníctvom súboru vstavaných tvorcov efektov, ako napríklad „TakeEvery“, `Takelatest`,` Fork`, `Call` a` put`. Tieto efekty generujú obyčajné objekty opisujúce vedľajšie účinky, ktoré middleware interpretuje na vykonávanie skutočných operácií. Pretože ságy opisujú „čo robiť“, a nie „ako to urobiť“, kód je čitateľnejší a testovateľný.
Pre súbežnosť umožňuje `Fork` paralelne spustiť ságy na začatie viacerých blokujúcich úloh. Napríklad sága môže rozvetviť niekoľko pozorovateľov, aby počúvali rôzne akcie súčasne alebo vykoná niekoľko hovorov API naraz. „Takeevery“ prevádzkuje ságu pre každú vyslanú akciu, ktorá sa zaoberá súčasťou viacerých akcií bez blokovania hlavnej ságy.
Naopak, Redux Thunk je skôr nevyhnutný ako deklaratívny. Tvorcovia akcií explicitne zvládajú asynchrónnu logiku s podmienkami a viacerými dispečingovými hovormi. Správa súbežnosti je manuálne, čo často vedie k zložitým vnoreným spätným volaniam alebo sľubom, ktoré ovplyvňujú udržateľnosť a jasnosť.
manipulovanie s komplexnými tokmi a zrušenie úlohy
Redux Saga podporuje zložitejšie asynchrónne pracovné toky nad rámec jednoduchých hovorov API, ako sú volebné hlasovanie na pozadí, demminovanie, opätovné opätovné storočiny a sekvenčné akcie podmienečne. Napríklad ságy môžu zrušiť prebiehajúce úlohy, keď sa vyskytnú určité kroky, čo zabráni dokončeniu zastaraných alebo zbytočných operácií. Toto zrušenie je rozhodujúce v súbežných scenároch, ako je automatické dopĺňanie vyhľadávania, kde nový užívateľ vstupuje predchádzajúce hovory API.
Redux Thunk nemá vstavané zručnosti a spolieha sa na externé knižnice alebo vlastnú logiku, aby sa dosiahli podobné účinky. Toto obmedzenie môže viesť k rasovým podmienkam a ťažšiemu riadeniu logiky s rastúcou zložitosťou aplikácie.
Testovateľnosť a oddelenie obáv
Pretože funkcie generátora Redux Saga poskytujú opisné účinky, je ľahšie jednotkový test bez prevádzky skutočných asynchrónnych operácií. Vývojári môžu testovať logiku ságy presadzovaním sekvencie a obsahu poskytnutých účinkov bez toho, aby sa museli zosmiešňovať celé prostredie asynchronizácie.
Testy Redux Thunk vo všeobecnosti zahŕňajú zosmiešňovanie obchodu Redux a presadzovanie vyslaných akcií po tom, čo sľuby vyrieši, ktoré testujú asynchrónne výsledky, ale nie riadenie toku v samotnom Thunku.
Redux Saga navyše presúva logiku vedľajšieho účinku z komponentov a tvorcov akcií do ságov, čo podporuje lepšie oddelenie obáv. Tento modulárny prístup zjednodušuje škálovanie viacerých operácií asynchronizácie vo väčších aplikáciách.
Úvahy o výkonnosti
Zatiaľ čo Redux Thunk môže zaviesť menej režijných nákladov pre jednoduché async toky kvôli svojej ľahkej povahe, účinnosť Redux Saga pri riešení viacerých súbežných úloh znižuje zložitosť a potenciálne chyby vo väčších a náročnejších aplikáciách. Organizovaním súbežných úloh deklaratívne a ich riadením prostredníctvom centralizovaného SAGA Middleware, Redux Saga optimalizuje manipuláciu s paralelnými operáciami a riadením vedľajších účinkov.
Zhrnutie
- Redux Saga používa funkcie generátora na pozastavenie a obnovenie vykonávania úloh, čo umožňuje presnú kontrolu nad súčasnými a paralelnými úlohami.
- Deklaratívna povaha účinkov Redux Sagy (`Fork`,` Call`, „Takeevery` atď.) Umožňuje jej zvládnuť zložité asynchrónne pracovné toky, ako sú opätovné opätovné opustenie, zrušenie a paralelizmus prirodzenejšie.
- Poskytuje zabudované nástroje na správu súbežnosti, ako napríklad „Fork“ pre paralelné úlohy a zrušenie, ktoré redux Thunk predvolene nedostanú.
- Čisté funkcie generátora Redux Saga Zlepšujú testovateľnosť tým, že uľahčujú uplatnenie poskytnutých efektov, zatiaľ čo testovanie Redux Thunk si vyžaduje výsmech.
- Redux Saga podporuje lepšiu organizáciu kódu a oddelenie obáv izolovaním vedľajších účinkov v ságách, a nie ich miešanie s tvorcami akcií alebo komponentmi.
- Redux Thunk je vhodnejší pre jednoduchšie, sekvenčné asynchrónne operácie, zatiaľ čo Redux Saga vyniká pri riadení viacerých, súbežných a zložitých vedľajších účinkov v škálovateľných aplikáciách.