我的 cron 作业始终包含相同的标记值

My cron job is always containing the same token values

我正在尝试创建一个 cron 作业,每分钟都会发出一个 API 请求来刷新会话。在请求中,我发送 refreshToken 作为请求正文。刷新令牌,我从商店获得。以下是我的要求。

api.actions.js

export const getAccessToken = () => {
  const { refreshToken } = store.getState(); // getting refreshToken from store
  return apiDefaultAction({
    url: ACCESS_TOKEN_URL,
    method: 'POST',
    data: {
      refresh_token: refreshToken,
    },
    onSuccess: apiData => {
      return {
        type: ACCESS_TOKEN_SUCCESS,
        payload: { ...apiData },
      };
    },
  });
};

请求响应是新的 accessTokenrefreshToken。 减速器然后用新的 accessTokenrefreshToken:

更新商店
export default (state = initialState, action) => {
  switch (action.type) {
    ...
    case ACCESS_TOKEN_SUCCESS:
      return {
        ...state,
        accessToken: action.payload.accessToken,
        refreshToken: action.payload.refreshToken,
      };
  }
};

我启动了在组件内调用此方法的 cron 作业:

import schedule from 'node-schedule';

const RUN_EVERY_MINUTE = '0 * * * * *';

export const initiateAccessToken = () => {
  schedule.scheduleJob(RUN_EVERY_MINUTE, () => {
    store.dispatch(getAccessToken());
  });
};

然而,当请求每分钟发生时,refreshToken 总是相同的,从第一个状态开始。第一个请求收到 200,其余请求未通过,因为 refreshToken 没有来自商店的更新值并且已过期。

我检查了请求前后的状态,redux 正在更新请求后的 refreshToken 值,但在 cron 作业中始终具有相同的标记。知道为什么会这样吗?

更新

我试过下面的例子,按钮值也没有改变:|

import React from 'react';
import schedule from 'node-schedule';

const RUN_EVERY_10_SEC = '0,10 * * * * *';

const TestComponent = () => {
  let value = 0;
  schedule.scheduleJob(RUN_EVERY_10_SEC, () => {
    value += 1;
  });
  const Button = <button>{value}</button>;
  return <div>{Button}</div>;
};

export default TestComponent;

我认为,原因是因为您的 node-schedule 代码在您第一次 运行 时保存了对任意函数的引用。 这意味着它将始终保留对商店初始状态的引用,这也解释了为什么您看不到更新。

可能最好的解决方案是将商店作为函数的依赖项传递:

import schedule from 'node-schedule';

const RUN_EVERY_MINUTE = '0 * * * * *';

export const initiateAccessToken = (store) => {
  schedule.scheduleJob(RUN_EVERY_MINUTE, () => {
    store.dispatch(getAccessToken());
  });
};

这样您的函数将始终具有对您商店的新的和更新的引用。