我在控制fetch()函数的执行方面遇到了问题。特别是我想避免让用户发送垃圾邮件fetch()请求。
我的想法是在中间件中执行此操作,但是当使用fetch()的操作到达那里时,有效负载已经是一个承诺。
所以我的问题是,fetch()到底是什么时候执行的?
如果重要,那么我的代码看起来大致如此。
父母行动:
{
return (dispatch) => {
if (mode === 'MY') {
dispatch(myAction(...);
}
dispatch(someOtherAction(...));
}
}
我的行动:
{
type: 'TYPE',
promise: post(url, payload)
}
我的帖子方法:
{
console.log('sending POST');
return fetch(url, {
//fetch info
});
}
我的中间件:
{
return next => action => {
const { promise, //other fields } = action;
//Already a promise here.
if (!promise) {
return next(action);
}
return promise.then(
//Processing data
);
};
}
答案 0 :(得分:0)
我的想法是在中间件中执行此操作,但是当使用fetch()的操作到达那里时,有效负载已经是一个承诺。
要解决这个问题,我会在行动中检查一下。因此,当您触发提取请求时,调度当前正在执行提取的操作,将状态更新为fetching = true
。然后在需要使用fetch的任何其他操作中,检查该状态,如果它是真的则不返回任何内容。
回答你的评论:
当你打电话给一个动作创建者时,当然会立即调用它。当你调用dispatch时,它将执行该函数(如果使用redux-thunk)。现在,由于redux-thunk是一个中间件,它会根据你附加中间件的顺序执行。因此,如果您在redux thunk之前将自己的中间件放在设置中,它将在它之前执行。
const store = createStore(
combineReducers(reducers),
applyMiddleware(yourMiddleware, ReduxThunk)
);
否则你的理解是正确的。调用调度后立即触发一个动作,它将按顺序通过中间件,然后将动作信息传递给减速器。