在 Redux Action 中轮询
Polling in Redux Action
我正在尝试在我的一个 redux 操作中取消轮询。以下是我的动作功能。貌似可以,但是当status不再是"updating",数据出现的时候,还是跑循环。不确定停止为什么不起作用。
export const getVisitSummary = () => async (dispatch: Function) => {
let res = await dispatch({
type: GET_VISIT_SUMMARY,
payload: {
client: 'visitSummary',
request: {
method: 'get',
url: '/visit-summaries'
}
}
});
const timelineStatus = res.payload.headers['x-timeline-status'];
const wait = (ms: number) => new Promise(r => setTimeout(r, ms));
// Not currently updating
if (timelineStatus !== 'updating') {
return res;
}
// Start polling
dispatch({ type: START_POLLING });
while (true) {
// wait 10 seconds
await wait(10000);
res = await dispatch({
type: GET_VISIT_SUMMARY,
payload: {
client: 'visitSummary',
request: {
method: 'get',
url: '/visit-summaries'
}
}
});
if (timelineStatus !== 'updating') {
break;
}
}
dispatch({ type: STOP_POLLING });
};
任何帮助都会有用!
将@azundo 的评论翻译成答案:
export const getVisitSummary = () => async (dispatch: Function) => {
let res = await dispatch({
type: GET_VISIT_SUMMARY,
payload: {
client: 'visitSummary',
request: {
method: 'get',
url: '/visit-summaries'
}
}
});
/***************************************/
/*** 1: Change from `const` to `let` ***/
/***************************************/
let timelineStatus = res.payload.headers['x-timeline-status'];
const wait = (ms: number) => new Promise(r => setTimeout(r, ms));
// Not currently updating
if (timelineStatus !== 'updating') {
return res;
}
// Start polling
dispatch({ type: START_POLLING });
while (true) {
// wait 10 seconds
await wait(10000);
res = await dispatch({
type: GET_VISIT_SUMMARY,
payload: {
client: 'visitSummary',
request: {
method: 'get',
url: '/visit-summaries'
}
}
});
/*********************************************************/
/*** 2: Use updated `timelineStatus` in if conditional ***/
/*********************************************************/
timelineStatus = res.payload.headers['x-timeline-status'];
if (timelineStatus !== 'updating') {
break;
}
}
dispatch({ type: STOP_POLLING });
};
我正在尝试在我的一个 redux 操作中取消轮询。以下是我的动作功能。貌似可以,但是当status不再是"updating",数据出现的时候,还是跑循环。不确定停止为什么不起作用。
export const getVisitSummary = () => async (dispatch: Function) => {
let res = await dispatch({
type: GET_VISIT_SUMMARY,
payload: {
client: 'visitSummary',
request: {
method: 'get',
url: '/visit-summaries'
}
}
});
const timelineStatus = res.payload.headers['x-timeline-status'];
const wait = (ms: number) => new Promise(r => setTimeout(r, ms));
// Not currently updating
if (timelineStatus !== 'updating') {
return res;
}
// Start polling
dispatch({ type: START_POLLING });
while (true) {
// wait 10 seconds
await wait(10000);
res = await dispatch({
type: GET_VISIT_SUMMARY,
payload: {
client: 'visitSummary',
request: {
method: 'get',
url: '/visit-summaries'
}
}
});
if (timelineStatus !== 'updating') {
break;
}
}
dispatch({ type: STOP_POLLING });
};
任何帮助都会有用!
将@azundo 的评论翻译成答案:
export const getVisitSummary = () => async (dispatch: Function) => {
let res = await dispatch({
type: GET_VISIT_SUMMARY,
payload: {
client: 'visitSummary',
request: {
method: 'get',
url: '/visit-summaries'
}
}
});
/***************************************/
/*** 1: Change from `const` to `let` ***/
/***************************************/
let timelineStatus = res.payload.headers['x-timeline-status'];
const wait = (ms: number) => new Promise(r => setTimeout(r, ms));
// Not currently updating
if (timelineStatus !== 'updating') {
return res;
}
// Start polling
dispatch({ type: START_POLLING });
while (true) {
// wait 10 seconds
await wait(10000);
res = await dispatch({
type: GET_VISIT_SUMMARY,
payload: {
client: 'visitSummary',
request: {
method: 'get',
url: '/visit-summaries'
}
}
});
/*********************************************************/
/*** 2: Use updated `timelineStatus` in if conditional ***/
/*********************************************************/
timelineStatus = res.payload.headers['x-timeline-status'];
if (timelineStatus !== 'updating') {
break;
}
}
dispatch({ type: STOP_POLLING });
};