Disclaimer: sono uno degli autori di Redux-Observable, quindi è difficile per me essere al 100% imparziale.
Al momento non forniamo alcun motivo per cui l'osservazione redux sia migliore della saga redux perché ... non lo è. 😆
tl; dr ci sono pro e contro per entrambi. Molti ne troveranno uno più intuitivo dell'altro, ma entrambi sono complessi da imparare in modi diversi se non si conoscono RxJS (osservabili con il redux) o generatori / "effetti come dati" (redux-saga).
Risolvono lo stesso problema in modi estremamente simili, ma presentano alcune differenze fondamentali che diventano veramente evidenti solo dopo averle usate abbastanza.
Redux-osservabile difende quasi tutto verso l'idiomatico RxJS. Quindi se hai la conoscenza di RxJS (o la ottieni), l'apprendimento e l'utilizzo di Redux-Observable è super naturale. Ciò significa anche che questa conoscenza è trasferibile a cose diverse dalla redux. Se decidi di passare a MobX, se decidi di passare a Angular2, se decidi di passare a un futuro hotness X, è estremamente probabile che RxJS ti possa aiutare. Questo perché RxJS è una libreria asincrona generica, e per molti versi è come un linguaggio di programmazione in sé - l'intero paradigma di "Programmazione reattiva". RxJS esiste dal 2012 ed è iniziato come una porta di Rx.NET (ci sono "porte" in quasi tutte le principali lingue, è così utile ).
redux-saga fornisce gli stessi operatori basati sul tempo, quindi mentre le conoscenze acquisite sui generatori e sulla gestione degli effetti collaterali in questo stile di gestione dei processi sono trasferibili, gli operatori e l'utilizzo effettivi non vengono utilizzati in nessun'altra libreria principale. Quindi è un po 'sfortunato, ma certamente non dovrebbe essere un affare da solo.
Utilizza anche "effetti come dati" ( qui descritti ), che all'inizio potrebbe essere difficile avvolgere la testa, ma significa che il codice redux-saga in realtà non esegue gli effetti collaterali stessi. Invece, le funzioni di supporto che usi creano oggetti che sono come attività che rappresentano l'intento di fare l'effetto collaterale e quindi la libreria interna lo esegue per te. Questo rende i test estremamente facili, senza la necessità di deridere ed è molto attraente per alcune persone. Tuttavia, ho scoperto personalmente che i test delle tue unità reimplementano gran parte della logica della tua saga, rendendo questi test IMO non molto utili (questa opinione non è condivisa da tutti)
Le persone spesso chiedono perché non facciamo una cosa del genere con l'osservazione redux: per me è fondamentalmente incompatibile con la normale Rx idiomatica. In Rx, utilizziamo operatori come quelli .debounceTime()
che incapsulano la logica richiesta per il debounce, ma ciò significa che se volessimo realizzarne una versione che non eseguisse effettivamente il debouncing e invece emettesse oggetti task con l'intento, ora hai perso il potenza di Rx perché non puoi più semplicemente concatenare gli operatori perché opererebbero su quell'oggetto task, non il vero risultato dell'operazione. Questo è davvero difficile da spiegare elegantemente. Richiede ancora una profonda comprensione di Rx per comprendere l'incompatibilità degli approcci. Se vuoi davvero qualcosa del genere, dai un'occhiata ai cicli di reduxche utilizza cycle.js e principalmente ha tali obiettivi. Trovo che richieda troppa cerimonia per i miei gusti, ma ti incoraggio a fare un giro se ti interessa.
Come accennato da ThorbenA, non mi esito ad ammettere che la redux-saga è attualmente (13/10/16) il chiaro leader nella complessa gestione degli effetti collaterali per il redux. È stato avviato in precedenza e ha una community più solida. Quindi c'è molta attrazione nell'usare lo standard di fatto sul nuovo bambino sul blocco. Penso che sia sicuro dire che se usi entrambi senza una conoscenza preliminare, sei in confusione. Entrambi usiamo concetti abbastanza avanzati che una volta "acquisiti", rendono la gestione complessa degli effetti collaterali molto più semplice, ma fino ad allora molti inciampano.
Il consiglio più importante che posso dare è di non portare nessuna di queste librerie prima che tu ne abbia bisogno. Se stai solo effettuando semplici chiamate Ajax, probabilmente non ti servono. redux-thunk è stupido e semplice da imparare e fornisce abbastanza per le basi - ma più è complesso il più difficile (o addirittura impossibile) diventa per redux-thunk. Ma per l'osservazione redux / la saga in molti modi brilla di più tanto più complesso è l'asincrono. C'è anche molto merito nell'usare redux-thunk con uno degli altri (redux-osservable / saga) nello stesso progetto! redux-thunk per le tue cose semplici comuni e poi usando solo redux-osservable / saga per cose complesse. Questo è un ottimo modo per rimanere produttivi, quindi non stai combattendo l'osservazione / la saga del redux per cose che sarebbero banali con il redux-thunk.