在Redux中观看Redux传奇动作

时间:2019-11-14 16:15:14

标签: redux redux-saga

我所有的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方法,因此我无法发送新动作。

1 个答案:

答案 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,然后取消或完成延迟并调度“无效动作”)