【问题标题】:How to use redux saga with without redux?如何在没有 redux 的情况下使用 redux saga?
【发布时间】:2016-08-09 23:01:10
【问题描述】:

我使用 redux-saga 的主要原因之一是它进行异步函数调用的可测试性。我的困境是,当我使用不属于我的 redux 存储的有状态对象进行编程时,使用 sagas 进行编程变得非常尴尬。是否有处理非纯数据对象和 redux-saga 的最佳实践?

假设我在 API 中注册了回调函数,在这种情况下是 firebase,我需要保留这些回调函数,以便以后取消注册。我无法将这些回调函数存储在 redux 中,那么将其写成 saga 还有意义吗?

在一段代码中似乎有点奇怪,以便能够使用诸如 put、select 之类的东西,而在其他代码中我必须使用 store.dispatch。

例子:

  const childAddedTrigger = (dataSnapshot: firebase.database.DataSnapshot) => {
    const message = Object.assign({}, dataSnapshot.val(), {
      key: dataSnapshot.key,
    });
    service.store.dispatch(Actions.channelMessageAdded(channelId, message));
  }    

  service.firebase.database().ref(`channels/${channelId}/messages`)
    .limitToLast(20)
    .on('child_added', childAddedTrigger);

  this.channelSubscriptions[channelId] = childAddedTrigger;

【问题讨论】:

  • 你能举个例子来说明你的烦恼吗?
  • 添加了一个快速示例,我想保存回调函数以便以后取消注册。我可以用更统一的传奇方式来写这个吗?
  • 生成器无法跟踪回调完成。没有比“on”更漂亮的方式来使用 firebase。
  • 我应该把这些回调放在哪里?我不能把它们放在redux中。如何在不使用 redux store 的情况下继续使用 saga 函数的格式?
  • 我的意思是你不能。您必须满足于使用 sagas 来侦听回调调度的操作。如果您想坚持使用 firebase 节点侦听器,则实际上无法使用 dispatch 方法。

标签: redux-saga


【解决方案1】:

您可能想使用 Channels 的 redux-saga 概念。

效果类似于take, call, put,它使异步函数很容易使用 redux-saga 进行测试,默认情况下会与 redux 的 store 交互,因为该库首先是一个 redux 中间件。

但是,eventChannel 工厂函数允许您从 websocket 或 firebase 获取外部事件源并从中“获取”事件,而不是从存储中获取操作并将事件“放置”给它们,而不是到 redux 商店。

【讨论】:

    【解决方案2】:

    你想要的是runSaga。它是通过将 saga 所需的一切作为参数来运行任何 saga 的函数。

    正如@TheBrofessor 所说,由于redux-saga 通过与一些输入和输出进行通信来工作,如果你可以定义这样的输入和输出,它就可以在redux-saga 中运行。 channel 选项和dispatch 选项负责为 saga 提供输入和输出。有关详细说明,请参阅文档。

    需要注意的一点是 stdChannel 的行为,但文档中没有记录。 实际上,the Channel document 中描述的通道的行为类似于队列。 stdChannel 的行为是订阅/调度(就像任何其他订阅框架中的“频道”一样)。

    这是因为stdChannel 是一个特殊频道,其行为类似于订阅频道。实际上,redux-saga 连接到 redux store 时,会将 store 的所有 dispatch event 放入stdChannel,所以每个takeing 的 saga 都可以接收到 dispatch event。

    你可以确认redux-saga实际上定义了multicastin their source code的概念,它是在stdChannel上实现的。

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 2018-03-13
      • 2019-09-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多