Isenção de responsabilidade: Eu sou um dos autores de redux observable, por isso é difícil para mim ser 100% imparcial.
Atualmente, não fornecemos nenhum motivo para que o redux-observable seja melhor que o redux-saga porque ... não é. 😆
tl; dr existem prós e contras para ambos. Muitos acharão um mais intuitivo que o outro, mas ambos são complexos para aprender de maneiras diferentes, se você não conhece RxJS (observável em redux) ou geradores / "efeitos como dados" (saga de redux).
Eles resolvem o mesmo problema de maneiras extremamente semelhantes, mas têm algumas diferenças fundamentais que só se tornam verdadeiramente aparentes quando você as usa o suficiente.
observável em redux adia quase tudo ao RxJS idiomático. Portanto, se você tem conhecimento de RxJS (ou obtém), aprender e usar o redux observável é super super natural. Isso também significa que esse conhecimento é transferível para outras coisas que não o redux. Se você optar por mudar para o MobX, se você optar por mudar para o Angular2, se você decidir mudar para algum gostinho futuro X, as chances são extremamente boas de que o RxJS possa ajudá-lo. Isso ocorre porque o RxJS é uma biblioteca assíncrona genérica e, de várias maneiras, é como uma linguagem de programação em si - todo o paradigma "Programação Reativa". O RxJS existe desde 2012 e começou como uma porta do Rx.NET (existem "portas" em quase todos os principais idiomas, é tão útil ).
O redux-saga fornece seus próprios operadores baseados em tempo, portanto, embora o conhecimento que você adquira sobre geradores e manuseie efeitos colaterais nesse estilo de gerenciador de processos seja transferível, os operadores e o uso reais não são usados em nenhuma outra biblioteca importante. Então isso é um pouco lamentável, mas certamente não deve ser um rompimento de acordos por si só.
Ele também usa "efeitos como dados" ( descritos aqui ), o que pode ser difícil de entender inicialmente, mas significa que o código da redux-saga não realiza os efeitos colaterais propriamente ditos. Em vez disso, as funções auxiliares usadas criam objetos que são como tarefas que representam a intenção de causar o efeito colateral e, em seguida, a biblioteca interna o executa para você. Isso torna os testes extremamente fáceis, sem a necessidade de zombaria e é muito atraente para algumas pessoas. No entanto, eu pessoalmente achei que isso significa que seus testes de unidade reimplementam grande parte da lógica da sua saga - tornando esses testes pouco úteis para IMO (essa opinião não é compartilhada por todos)
As pessoas frequentemente perguntam por que não fazemos algo assim com redux observável: para mim é fundamentalmente incompatível com o Rx idiomático normal. No Rx, usamos operadores como .debounceTime()
esse que encapsulam a lógica necessária para rebater, mas isso significa que, se quiséssemos fazer uma versão dela que na verdade não executa a depuração e emite objetos de tarefa com a intenção, você agora perdeu o poder do Rx porque você não pode mais encadear operadores porque eles operariam nesse objeto de tarefa, não no resultado real da operação. É realmente difícil de explicar de maneira elegante. Mais uma vez, é necessário um forte entendimento de Rx para entender a incompatibilidade de abordagens. Se você realmente quer algo assim, confira os ciclos de reduxque usa o cycle.js e tem principalmente esses objetivos. Acho que exige muita cerimônia para o meu gosto, mas encorajo você a dar uma volta, se for do seu interesse.
Como ThorbenA mencionou, eu não evito admitir que o redux-saga é atualmente (13/10/16) o líder claro no gerenciamento complexo de efeitos colaterais do redux. Foi iniciado anteriormente e tem uma comunidade mais robusta. Portanto, há muita atração em usar o padrão de fato sobre o novo garoto do quarteirão. Eu acho que é seguro dizer que, se você usa ou sem conhecimento prévio, você está confuso. Nós dois usamos conceitos bastante avançados que, quando você "obtém", facilitam muito o gerenciamento complexo de efeitos colaterais, mas até então muitos tropeçam.
O conselho mais importante que posso dar é não trazer nenhuma dessas bibliotecas antes que você precise delas. Se você está fazendo apenas chamadas ajax simples, provavelmente não precisa delas. redux-thunk é estúpido, simples de aprender e fornece o suficiente para o básico - mas quanto mais complexo o assíncrono, mais difícil (ou até impossível) se torna para o redux-thunk. Mas, para o redux observável / saga, de muitas maneiras, ele brilha tanto quanto mais complexo é o assíncrono. Também há muito mérito em usar o redux-thunk com um dos outros (redux-observable / saga) no mesmo projeto! redux-thunk para coisas simples e comuns e, em seguida, use apenas redux-observable / saga para coisas complexas. Essa é uma ótima maneira de permanecer produtivo, para que você não esteja lutando com redux-observable / saga por coisas que seriam triviais com redux-thunk.