在我的反应项目中,我有一个看起来像这样的动作文件:
const startLoad = () => async (dispatch) => {
dispatch({
type: CONTENT_LOAD,
});
};
// Get all content
export const getContents = () => async (dispatch) => {
dispatch(startLoad());
// some more code...
};
所以在这个例子中,我知道调度来自middleware
,getContents
可以访问它,因为它是使用mapDispatchToProps
映射的。所以我假设当调用getContents
时,它真的是这样称呼的 ->dispatch(getContents)
但这可以在普通的 JavaScript 中复制,这样我就能看到到底发生了什么?如果我错了为什么getContents
可以访问dispatch
请告诉我。
例如,startLoad
如何仅仅因为dispatch
被称为startLoad
而能够使用dispatch
?我注意到如果我这样称呼它,它也会起作用:dispatch(startLoad(dispatch));
.
将调度传递给startLoad
实际上对我来说更有意义,所以我不明白为什么不需要这样做。
编辑:这是我自己能想出的最接近的例子。
const fun = () => (fun2) => {
fun2();
}
const fun2 = () => {
console.log('hello');
}
fun()(fun2);
假设当调用getContent时,它真的叫像 这个 -> 调度(getContent(,但这可以用普通文复制吗 JavaScript 这样我就能看到到底发生了什么?如果我错了 为什么getContent可以访问调度,请告诉我。
redux-thunk的实现非常简单
function createThunkMiddleware(extraArgument) {
return ({ dispatch, getState }) => (next) => (action) => {
if (typeof action === 'function') {
return action(dispatch, getState, extraArgument);
}
return next(action);
};
}
如您所见,它会检查操作是否为函数。
和奖金,如果你愿意,你可以在调度后在参数中获得整个状态和额外的参数
例如,isstartLoad 如何使用调度,因为 调度称为启动加载?我注意到它也可以工作,如果我 这样称呼它:dispatch(startLoad(dispatch((;。
看起来中间件也可以处理上述情况。