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

时间:2016-08-09 23:01:11

标签: redux-saga

使用redux-saga的一个主要原因是它是如何进行异步函数调用的。我的困境是,当我使用不属于我的redux商店的有状态对象进行编程时,使用sagas编程变得相当尴尬。是否有使用非纯数据对象和redux-saga的最佳实践?

假设我有回调函数,我在这种情况下使用API​​注册了firebase,我需要预订这些回调函数,以便稍后取消注册。我无法在redux中存储这些回调函数,所以将它写为传奇仍然有意义吗?

在一段代码中似乎有点奇怪,以便能够使用诸如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;

2 个答案:

答案 0 :(得分:2)

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

take, call, put这样的效果就像使用redux-saga一样容易测试的异步函数与redux的存储进行交互,因为该库首先是一个redux中间件。

但是,eventChannel工厂函数允许您从websocket或firebase获取外部事件源并从中获取事件,而不是从商店调度操作并向其发送'put'事件,而不是redux商店。

答案 1 :(得分:0)

您想要的是runSaga。它是通过提供传奇故事所需的一切作为参数来运行任何传奇故事的功能。

如@TheBrofessor所述,由于redux-saga通过与某些输入和输出进行通信来工作,因此,如果可以定义此类输入和输出,则可以在redux-saga中运行它。 channel选项和dispatch选项负责为传奇提供输入和输出。请参阅文档以获取详细说明。

文档中未记录的一件事是stdChannel的行为。 实际上,the Channel document中描述的通道的行为类似于队列。 stdChannel的行为是订阅/调度(就像其他任何订阅框架中的“渠道”一样)。

这是因为stdChannel是一个特殊的频道,其创建类似于订阅频道。实际上,将redux-saga连接到redux商店时,会将所有商店的调度事件放入stdChannel中,因此take的每个saga都可以接收该调度事件。

您可以确认redux-saga实际上定义了multicast in their source code的概念,该概念是在stdChannel上实现的。