在redux中观看redux传奇动作
我所有的API调用都由在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
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版本兼容。