我所有的API调用均由redux-sagas
处理。我正在我的应用程序中创建心跳模式以检测不活动状态。每次出现传奇事件,我都想清除setTimeout,以便知道用户处于活动状态。
我的中间件目前是基本的:
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_ACTION
似乎是判断动作是否为传奇的唯一方法。我看到redux-sagas有一个createSagaMiddleware(options)
,我尝试使用effectMiddlewares
,但似乎您无法访问其中的dispatch
方法,因此我无法发送新动作。
答案 0 :(得分:1)
但是您似乎无法访问其中的dispatch方法,因此我无法发送新操作。
不确定这是否是您想要的解决方案,但是您可以访问代码段中注释// send off an action to tell user they are inactive
位于的分发方法,因为该注释由store对象公开。 (这在redux docs中商店的“商店方法”部分中进行了记录)
因此,以下内容应能满足您的情况:
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效果)来实现此目的,也许这也是您的一个选择:
佐贺传奇
import { put, delay } from "redux-saga/effects";
function* inactiveSaga() {
yield delay(100000);
yield put({ type: "USER_INACTIVE" })
}
上面的传奇集成示例:
(在根目录中添加以下内容)
//import { takeLatest } from "redux-saga/effects";
takeLatest(() => true, inactiveSaga)
说明::每个操作都会触发inactiveSaga(原因为() => true
)。 inactiveSaga将等待100000ms,然后调度“ inactive action”。如果在此等待时间内有新动作,则将取消先前执行的inactiveSaga(因为takeLatest
,请参见redux-saga effect docs进行takeLatest)并从头开始。 (因此,不会发送“无效动作”,并且inactiveSaga将再次等待这100000ms,然后取消或完成延迟并调度“无效动作”)