Javascript 为什么在Redux传奇中使用Redux Observable?

Javascript 为什么在Redux传奇中使用Redux Observable?,javascript,redux,reactive-programming,redux-saga,redux-observable,Javascript,Redux,Reactive Programming,Redux Saga,Redux Observable,我用过。到目前为止,用它编写的代码很容易理解,除了JS生成器函数有时会把我弄糊涂。据我所知,我可以完成类似的工作,处理副作用,但不使用发电机功能 然而,Redux Observable的文档并没有提供很多关于它为何优于Redux传奇的观点。我想知道不使用生成器函数是否是使用Redux Observable的唯一好处。使用Redux Observable而不是Redux Saga会有什么缺点、问题或妥协?提前感谢。我使用Redux Observable而不是Redux Saga,因为我更喜欢使用O

我用过。到目前为止,用它编写的代码很容易理解,除了JS生成器函数有时会把我弄糊涂。据我所知,我可以完成类似的工作,处理副作用,但不使用发电机功能


然而,Redux Observable的文档并没有提供很多关于它为何优于Redux传奇的观点。我想知道不使用生成器函数是否是使用Redux Observable的唯一好处。使用Redux Observable而不是Redux Saga会有什么缺点、问题或妥协?提前感谢。

我使用Redux Observable而不是Redux Saga,因为我更喜欢使用Observable而不是生成器。我将它与RXJS一起使用,RXJS是一个用于处理数据流的强大库。把它想象成异步的lodash。在选择一个而不是另一个的过程中,有任何缺点、问题和妥协,请看看杰伊·菲尔普斯:

redux传奇作为一个项目存在的时间比redux可观察的时间要长,所以这当然是一个主要卖点。您将发现更多的文档、示例,并且可能有更好的社区可以从中获得支持

相反,你在redux传奇中学习到的操作符和API远不如学习RxJS那样可移植,RxJS到处都在使用。redux observable在内部非常简单,它为您提供了一种使用RxJS的自然方式。所以,如果你知道RxJS(或想知道),这是一种非常自然的搭配

目前我对大多数人的建议是,如果你不得不问你应该使用哪一种,你可能应该选择redux saga


免责声明:我是redux observable的作者之一,所以很难做到100%公正


我们目前没有提供任何理由说明redux observable比redux saga更好,因为……事实并非如此 我认为有些事情你需要考虑

  • 复杂性
  • 编码风格
  • 学习曲线
  • 可测试性
  • 假设我们想从API获取用户


    此外,我写这篇文章是为了深入比较Redux传奇和Redux Observable之间的差异。检查或。

    我重视Rx具有的跨语言和运行时的可转移性。即使你的应用程序不会改变语言,你的职业生涯也会改变。无论你如何衡量自己的学习水平,都要尽可能充分利用你的学习成果。它是通往.Net LINQ的绝佳门户。

    Redux Observable是一个令人惊叹的库,我们在生产中使用了1.5年,迄今为止没有任何问题,它完全可测试,并且可以轻松与任何框架集成。我们拥有超负荷的并行套接字通道,唯一能让我们免于冻结的是可观察到的Redux

    我想在这里提三点

    1。复杂性和学习曲线

    Redux传奇很容易击败这里可以观察到的Redux。如果你只需要一个简单的请求来完成授权,并且由于某些原因,你不想使用ReDux Sthink,那么你应该考虑使用ReDux SaGa,它更容易理解。 如果您事先不知道可观测的情况,这将是您的痛苦,您的团队将对您进行培训:)

    2。Observable和RxJS能为我提供什么?

    当谈到异步逻辑时,Observable是你的瑞士刀,Observable几乎可以为你做任何事情。你永远不应该把它们和承诺或发电机相比——它们的威力要大得多,就像把擎天柱和雪佛兰相比较一样

    那么RxJS呢?它类似于lodash.js,但对于异步逻辑,一旦您进入,您将永远不会切换到其他内容

    3。被动扩展

    只需查看此链接

    反应式扩展适用于所有现代编程语言,它只是函数式编程的关键


    因此,明智地花时间学习RxJS并使用redux observable:)

    既然这里有一大堆redux observable的话题,我想我应该给出争论的传奇一面。我没有使用redux observable或RxJS,因此我无法进行并列比较,但我使用了sagas,效果非常好

    不管它值多少钱,我在web应用程序的生产中使用了sagas

    传奇vs.Thunk 传奇故事轻而易举地获胜。我不喜欢thunk把逻辑放在我的动作创作者身上。它还使得连续执行几个请求变得很麻烦。我简要地看了一下这份工作中的redux observable,但还是选择了传说

    传奇的学习曲线 理解发电机是什么以及它们为什么重要是理解传奇的关键。但我要强调的是,你不需要了解发电机的内部和外部。您只需要知道您正在使用yield语句传递控制,并且在异步代码解析后,saga将传递回控制。在那之后,不难理解一个传奇故事中发生了什么

    根据我的经验,核心传奇方法有:

    • call
      -调用任意代码位并获取返回值。支持承诺。异步处理和sagas之间的巨大协同作用
    • 选择
      -调用选择器。这一点相当精彩。选择器是redux的核心,100%支持
    • put
      -aka
      dispatch
      一个动作。事实上,你想派多少就派多少
    还有其他功能,但如果你能掌握这三个,你将处于一个非常好的位置

    结论 我选择sagas的原因是它的易用性。redux observable看起来像一个挑战。我对传奇故事100%满意。比我想象的更幸福

    根据我的经验,传奇故事比thunks好,而且相对容易理解。Rx不是每个人都喜欢的。如果你不是来自那个生态系统和/或不打算在RT中使用RX,我会强烈地考虑SaaS而不是ReDux。
    // Redux-Saga
    
    import axios from 'axios' 
    
    function* watchSaga(){
      yield takeEvery('fetch_user', fetchUser) // waiting for action (fetch_user)
    }
    
    function* fetchUser(action){
        try {
            yield put({type:'fetch_user_ing'})
            const response = yield call(axios.get,'/api/users/1')
            yield put({type:'fetch_user_done',user:response.data})
      } catch (error) {
            yield put({type:'fetch_user_error',error})
      }
    }
    
    // Redux-Observable
    import axios from 'axios'
    
    const fetchUserEpic = action$ => 
        action$
            .ofType('fetch_user')
            .flatMap(()=>
              Observable.from(axios.get('/api/users/1')) // or use Observable.ajax
                .map(response=>({type:'fetch_user_done', user:response.data}))
                .catch(error => Observable.of({type:'fetch_user_error',error}))
                .startWith({type:'fetch_user_ing'})
            )