在我的反应项目中,我有一个如下所示的操作文件:
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
,dispatch
就能够使用 startLoad
?我注意到,如果我这样称呼它,它也会起作用:dispatch(startLoad(dispatch));
。
将调度传递给
startLoad
实际上对我来说更有意义,所以我不明白为什么不需要这样做。
编辑:这是我自己能想到的最接近的例子。
const fun = () => (fun2) => {
fun2();
}
const fun2 = () => {
console.log('hello');
}
fun()(fun2);
所以我假设当 getContents 被调用时,它实际上被称为 this ->dispatch(getContents) 但这可以简单地复制吗 JavaScript 以便我可以看到到底发生了什么?如果我错了 为什么 getContents 可以访问调度,请告诉我。
function createThunkMiddleware(extraArgument) {
return ({ dispatch, getState }) => (next) => (action) => {
if (typeof action === 'function') {
return action(dispatch, getState, extraArgument);
}
return next(action);
};
}
如您所见,它检查操作是否是一个函数。
还有额外的好处,如果您愿意,您可以在调度之后在参数中获取整个状态和额外参数
例如,isstartLoad 如何能够使用调度,只是因为 调度调用startLoad?我注意到它也会起作用,如果我 像这样调用它:dispatch(startLoad(dispatch));。
看起来中间件也可以处理上述情况。