在redux中观看redux传奇动作

在redux中观看redux传奇动作,redux,redux-saga,Redux,Redux Saga,我所有的API调用都由redux sagas处理。我正在我的应用程序中创建心跳模式以检测不活动。每次发生传奇事件时,我都想清除设置超时,这样我就知道用户处于活动状态 我的中间件目前是一个基本的中间件: const heartbeatMonitor => store => next => action { if (action['@@redux-saga/SAGA_ACTION']) { clearTimeout(window.myTimeout); } w

我所有的API调用都由
redux sagas
处理。我正在我的应用程序中创建心跳模式以检测不活动。每次发生传奇事件时,我都想清除设置超时,这样我就知道用户处于活动状态

我的中间件目前是一个基本的中间件:

const heartbeatMonitor => store => next => action {
  if (action['@@redux-saga/SAGA_ACTION']) {
    clearTimeout(window.myTimeout);
  }

  window.myTimeout = window.setTimeout(function() {
    // send off an action to tell user they are inactive
  }, 100000);
}
似乎在寻找这个符号,
@@redux saga/saga\u ACTION
,是判断该动作是否为传奇的唯一方法。我看到redux sagas有一个
createSagaMiddleware(选项)
,我试着使用
EffectMiddleware
,但似乎您没有访问其中的
dispatch
方法,因此我无法发送新操作

但是你似乎没有权限访问其中的dispatch方法,所以我无法发送新操作

不确定这是否是您想要的解决方案,但您确实可以访问dispatch方法,在该方法中,您的注释
//发送一个操作,告诉用户他们处于非活动状态
,该操作位于您的代码段中,因为它由store对象公开。(这记录在中的存储方法部分)

因此,以下内容应满足您的要求:

const heartbeatMonitor => store => next => action {
  if (action['@@redux-saga/SAGA_ACTION']) {
    clearTimeout(window.myTimeout);
  }

  const { dispatch } = store;

  window.myTimeout = window.setTimeout(() => {
    dispatch({ type: "USER_INACTIVE" });
  }, 100000);
}
注意:我可能会以不同的方式实现这一点(使用redux sagas效果),也许这也是您的一个选择:

范例传奇

从“redux saga/effects”导入{put,delay};
函数*inactiveSaga(){
产量延迟(100000);
产生put({type:“USER_INACTIVE”})
}
上述saga集成示例:

(在你的根传奇中添加以下内容)

//从“redux saga/effects”导入{takeLatest};
takeLatest(()=>true,不活动)
说明:每个操作都会触发不活动状态(原因
()=>true
)。在调度“非活动操作”之前,非活动VESAGA将等待100000毫秒。如果在此等待时间内有新操作,则先前执行的inactiveSaga将被取消(原因
takeLatest
,请参阅获取takeLatest),并重新从头开始。(因此,在取消或完成延迟并发送“非活动操作”之前,不会发送任何“非活动操作”,且“非活动操作”将再次开始等待这100000毫秒)

但是你似乎没有权限访问其中的dispatch方法,所以我无法发送新操作

不确定这是否是您想要的解决方案,但您确实可以访问dispatch方法,在该方法中,您的注释
//发送一个操作,告诉用户他们处于非活动状态
,该操作位于您的代码段中,因为它由store对象公开。(这记录在中的存储方法部分)

因此,以下内容应满足您的要求:

const heartbeatMonitor => store => next => action {
  if (action['@@redux-saga/SAGA_ACTION']) {
    clearTimeout(window.myTimeout);
  }

  const { dispatch } = store;

  window.myTimeout = window.setTimeout(() => {
    dispatch({ type: "USER_INACTIVE" });
  }, 100000);
}
注意:我可能会以不同的方式实现这一点(使用redux sagas效果),也许这也是您的一个选择:

范例传奇

从“redux saga/effects”导入{put,delay};
函数*inactiveSaga(){
产量延迟(100000);
产生put({type:“USER_INACTIVE”})
}
上述saga集成示例:

(在你的根传奇中添加以下内容)

//从“redux saga/effects”导入{takeLatest};
takeLatest(()=>true,不活动)

说明:每个操作都会触发不活动状态(原因
()=>true
)。在调度“非活动操作”之前,非活动VESAGA将等待100000毫秒。如果在此等待时间内有新操作,则先前执行的inactiveSaga将被取消(原因
takeLatest
,请参阅获取takeLatest),并重新从头开始。(因此,在取消或完成延迟并发送“非活动操作”之前,不会发送任何“非活动操作”,且“非活动操作”将再次开始等待这100000毫秒)

Ah gotcha。我不知道延迟功能可以这样工作。这绝对是一个比我的中间件更好的解决方案。我想澄清一下“@@redux saga/saga_ACTION”是否是判断动作是否为saga的唯一方法,但似乎是这样。哦,嗯,我不知道这一点,但可能有一个值为该值的导出常量,可以导入。使用它可能会让你更清楚地知道你在用这个函数做什么,并确保与未来的redux saga版本兼容。啊,明白了。我不知道延迟功能可以这样工作。这绝对是一个比我的中间件更好的解决方案。我想澄清一下“@@redux saga/saga_ACTION”是否是判断动作是否为saga的唯一方法,但似乎是这样。哦,嗯,我不知道这一点,但可能有一个值为该值的导出常量,可以导入。使用它可能会使您更清楚地使用该功能,并确保与未来的redux saga版本兼容。