如何在没有 redux 的情况下使用 redux saga?

How to use redux saga with without redux?

我使用 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;

你会想要使用 Channels 的 redux-saga 概念。

效果类似于 take, call, put 使得异步函数在默认情况下可以很容易地使用 redux-saga 进行测试,因为该库首先是一个 redux 中间件。

但是,eventChannel 工厂函数允许您从 websocket 或 firebase 获取外部事件源和 'take' 事件,而不是从商店和 'put' 事件给他们,而不是 redux 存储。

你要的是runSaga。它是 运行 任何传奇的功能,它提供传奇所需的一切作为参数。

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

需要注意的一件事是 stdChannel 的行为,但文档中没有记录。 实际上,the Channel document 中描述的通道的行为类似于队列。 stdChannel 的行为更像是 subscribe/dispatch(就像任何其他订阅框架中的 "channels")。

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

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

上实现的