我正在尝试创建一个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
然后,reducer使用新的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());
  });
};


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

09-20 09:20