Haftungsausschluss: Ich bin einer der Autoren von Redux-Observable, daher fällt es mir schwer, 100% unparteiisch zu sein.
Wir geben derzeit keinen Grund an, warum Redux-Observable besser ist als Redux-Saga, weil ... es nicht ist. 😆
Es gibt Vor- und Nachteile für beide. Viele werden feststellen, dass einer intuitiver ist als der andere, aber beide sind auf unterschiedliche Weise komplex zu lernen, wenn Sie RxJS (redux-beobachtbar) oder Generatoren / "Effekte als Daten" (Redux-Saga) nicht kennen.
Sie lösen das gleiche Problem auf äußerst ähnliche Weise, weisen jedoch einige grundlegende Unterschiede auf, die erst dann wirklich sichtbar werden, wenn Sie sie ausreichend verwenden.
Redux-Observable verschiebt fast alles auf idiomatisches RxJS. Wenn Sie also über RxJS-Kenntnisse verfügen (oder diese erwerben), ist das Lernen und Verwenden von Redux-Observable super super natürlich. Das bedeutet auch, dass dieses Wissen auf andere Dinge als Redux übertragbar ist. Wenn Sie sich für einen Wechsel zu MobX entscheiden, wenn Sie sich für einen Wechsel zu Angular2 entscheiden, wenn Sie sich für einen Wechsel zu einer zukünftigen Hotness X entscheiden, stehen die Chancen sehr gut, dass RxJS Ihnen helfen kann. Dies liegt daran, dass RxJS eine generische asynchrone Bibliothek ist und in vielerlei Hinsicht wie eine Programmiersprache an sich ist - das gesamte Paradigma der "reaktiven Programmierung". RxJS existiert seit 2012 und wurde als Port von Rx.NET gestartet (es gibt "Ports" in fast jeder wichtigen Sprache, es ist so nützlich ).
redux-saga stellt seine zeitbasierten Operatoren selbst zur Verfügung. Während das Wissen, das Sie über Generatoren und den Umgang mit Nebenwirkungen in diesem Prozessmanager-Stil erwerben, übertragbar ist, werden die tatsächlichen Operatoren und die Verwendung in keiner anderen wichtigen Bibliothek verwendet. Das ist ein bisschen unglücklich, sollte aber auf keinen Fall ein Deal-Breaker für sich sein.
Es werden auch "Effekte als Daten" ( hier beschrieben ) verwendet, was zunächst schwierig sein kann, aber es bedeutet, dass Ihr Redux-Saga-Code die Nebenwirkungen selbst nicht ausführt. Stattdessen erstellen die von Ihnen verwendeten Hilfsfunktionen Objekte, die Aufgaben ähneln, die die Absicht darstellen, den Nebeneffekt auszuführen, und die die interne Bibliothek dann für Sie ausführt. Dies macht das Testen extrem einfach, ohne dass man sich verspotten muss, und ist für manche Menschen sehr attraktiv. Ich persönlich habe jedoch festgestellt, dass Ihre Unit-Tests einen Großteil der Logik Ihrer Saga neu implementieren - was diese Tests IMO nicht sehr nützlich macht (diese Meinung wird nicht von allen geteilt).
Die Leute fragen oft, warum wir so etwas nicht mit Redux-Observable machen: Für mich ist es grundsätzlich nicht kompatibel mit normalem idiomatischem Rx. In Rx verwenden wir .debounceTime()
solche Operatoren , die die zum Entprellen erforderliche Logik kapseln. Wenn wir jedoch eine Version davon erstellen möchten, die das Entprellen nicht tatsächlich durchführt und stattdessen Aufgabenobjekte mit der Absicht ausgibt, haben Sie jetzt die verloren Leistung von Rx, weil Sie nicht mehr nur Operatoren verketten können, weil sie an diesem Task-Objekt arbeiten würden, nicht das eigentliche Ergebnis der Operation. Das ist wirklich schwer elegant zu erklären. Es erfordert wiederum ein umfassendes Verständnis von Rx, um die Inkompatibilität von Ansätzen zu verstehen. Wenn Sie so etwas wirklich wollen, schauen Sie sich das an Redux-Zyklen andie cycle.js verwendet und meistens diese Ziele hat. Ich finde, es erfordert zu viel Zeremonie für meinen Geschmack, aber ich ermutige Sie, es zu versuchen, wenn es Sie interessiert.
Wie ThorbenA erwähnte, scheue ich mich nicht zuzugeben, dass die Redux-Saga derzeit (13.10.16) der klare Marktführer im komplexen Management von Nebenwirkungen für Redux ist. Es wurde früher gestartet und hat eine robustere Community. Es ist also sehr attraktiv, den De-facto-Standard gegenüber dem neuen Kind auf dem Block anzuwenden. Ich denke, es ist sicher zu sagen, wenn Sie beides ohne Vorkenntnisse verwenden, werden Sie verwirrt sein. Wir verwenden beide ziemlich fortschrittliche Konzepte, die das komplexe Management von Nebenwirkungen erheblich vereinfachen, sobald Sie es "bekommen", aber bis dahin stolpern viele.
Der wichtigste Rat, den ich geben kann, ist, keine dieser Bibliotheken einzubringen, bevor Sie sie benötigen. Wenn Sie nur einfache Ajax-Anrufe tätigen, brauchen Sie diese wahrscheinlich nicht. Redux-Thunk ist dumm, einfach zu erlernen und bietet genug für die Grundlagen - aber je komplexer die Asynchronität, desto schwieriger (oder sogar unmöglich) wird es für Redux-Thunk. Aber für Redux-Observable / Saga scheint es in vielerlei Hinsicht am komplexesten, je komplexer die Asynchronität ist. Es ist auch eine Menge Verdienst, Redux-Thunk mit einem der anderen (Redux-Observable / Saga) im selben Projekt zu verwenden! Redux-Thunk für Ihre üblichen einfachen Sachen und dann nur Redux-Observable / Saga für komplexe Sachen. Das ist eine großartige Möglichkeit, um produktiv zu bleiben. Sie kämpfen also nicht gegen Redux-Observable / Saga um Dinge, die mit Redux-Thunk trivial wären.