javascript - redux中间件applyMiddleware执行有一点不懂,求解答?
天蓬老师
天蓬老师 2017-04-11 10:57:16
[JavaScript讨论组]

1.我传入thunk,promise,logger中间件,当dispatch 传入的action是一个function更新数据,根据thunk的源码,后面的promise,logger中间件都不会执行。那么logger中间件如何记录的action的更新数据?

let newStore = applyMiddleware(thunk, promise,logger)(createStore)(reducer, null);
//applyMiddleware返回的dispatch 应该是
dispatch = thunk(promise(logger(store.dispatch)));
//先看thunk源码
function createThunkMiddleware(extraArgument) {
  return function (_ref) {
    var dispatch = _ref.dispatch;
    var getState = _ref.getState;
    return function (next) {
      return function (action) {
        if (typeof action === 'function') {
          return action(dispatch, getState, extraArgument);
        }
        return next(action);
      };
    };
  };
}
var thunk = createThunkMiddleware();
thunk.withExtraArgument = createThunkMiddleware;
正常执行流程应该是
thunk -> promise -> logger -> dispatch -> logger -> promise -> thunk 
当我dispatch 传入的action是一个function更新数据,根据thunk的源码,
后面的promise,logger中间件都不会执行。那么logger中间件如何记录的action的更新数据?

2.在thunk,promise里面都采用的return 下一个next,那么dispatch ->后面的logger -> promise -> thunk那不是都不会执行了吗?
我看着是这两篇关于applyMiddleware文章链接描述,链接描述

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
高洛峰

先说结论:

  1. thunk 后面的中间件不走了,自然 logger 也无法记录。

  2. next 是包装过后的 dispatch,也就是用来一层层调用 middleware 的,这个看官网的教程应该很好理解。

thunk 中间件的核心是下面这段。

if (typeof action === 'function') {
    return action(dispatch, getState, extraArgument);
}
return next(action);

thunk 后面中间件不走,是因为它没有将你的方法通过 next 传递给下一个中间件,而是直接调用了你方法,并将 dispatch 传给了你的方法的第一个参数,这样使得你可以在你的函数中再使用 dispatch 来 dispatch 一个 action。新 dispatch 的 action 自然会重新走整个 middleware 的流程。

所以,如果你将 logger 置于 thunk 之后,且函数不再 dispatch 一个 action 的话,logger 中间件是不会有记录的。

需要注意的是,logger 中间件是否执行取决于你 applyMiddleware 的次序,如果,你将例子中 applyMiddleware 的顺序倒一倒,logger 中间件还是会走的。

黄舟

各位老司机 帮忙求解答

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号