我在控制fetch()函数的执行时遇到了问题。我特别想避免用户发送垃圾fetch()请求。
我的想法是在中间件内部做到这一点,但是当带有fetch()的操作到达那里时,有效负载已经是一个承诺。
所以我的问题是,什么时候fetch()已经被执行?
如果重要的话,那么我的代码大致如下:
父行动:{
return (dispatch) => {
if (mode === 'MY') {
dispatch(myAction(...);
}
dispatch(someOtherAction(...));
}
}
我的行动:
{
type: 'TYPE',
promise: post(url, payload)
}
我的post方法:
{
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
);
};
}
我的想法是在中间件内部做到这一点,但是当带有fetch()的操作到达那里时,有效负载已经是一个承诺。
为了解决这个问题,我将它作为动作内部的检查。当你触发取回请求时,调度取回当前正在执行的动作,更新状态说fetching = true
。然后在任何其他需要使用fetch的操作中,检查该状态,如果为真则不返回任何值。
回复你的评论:
当你调用一个动作创建器时,它当然会立即被调用。当您调用调度时,它将执行函数(如果使用redux-thunk)。现在,由于redux-thunk是一个中间件,它的执行取决于您附加中间件的顺序。因此,如果您在redux之前将自己的中间件放在设置中,它将在它之前执行。
const store = createStore(
combineReducers(reducers),
applyMiddleware(yourMiddleware, ReduxThunk)
);
否则你的理解是正确的。一个动作在调用调度后立即触发,它将按顺序通过中间件,然后将动作信息传递给reducer。