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

joe*_*kim 5 redux-saga

我使用 redux-saga 的主要原因之一是它使异步函数调用的可测试性。我的困境是,当我使用不属于我的 redux 存储的有状态对象进行编程时,使用 saga 进行编程会变得非常尴尬。是否有使用非纯数据对象和 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;
Run Code Online (Sandbox Code Playgroud)

The*_*sor 6

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

效果就像这样take, call, put,在默认情况下,使用 redux-saga 测试异步函数很容易与 redux 的商店交互,因为该库首先是一个 redux 中间件。

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