我正在尝试创建一个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 },
};
},
});
};
请求响应是新的
accessToken
和refreshToken
。然后,reducer使用新的
accessToken
和refreshToken
更新商店: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());
});
};
这样,您的函数将始终具有对商店的新的和更新的引用。