zoukankan      html  css  js  c++  java
  • applyMiddleware 沉思录

    let newStore = applyMiddleware(mid1, mid2, mid3, ...)(createStore)(reducer, null);

    给({ getState, dispatch }) => next => action签名的函数组分步赋值并进行串联的过程;

    整体上是dispatch的method swizzling;

    export default function applyMiddleware(...middlewares) {

      return (next)  =>

         (reducer, initialState) => {

            var store = next(reducer, initialState);

            var dispatch = store.dispatch;

            var chain = [];

    //({ getState, dispatch })

            var middlewareAPI = {

              getState: store.getState,

              dispatch: (action) => dispatch(action)

            };

    //({ getState, dispatch })

            chain = middlewares.map(middleware => middleware(middlewareAPI));

    //next

            dispatch = compose(...chain, store.dispatch);

            return {

              ...store,

              dispatch

            };

       };

    }

    export default store => next => action => {

        console.log('dispatch:', action);

        next(action);

        console.log('finish:', action);

    }

    export default ({ getState, dispatch }) => next => action => {

        console.log('dispatch:', action);

        next(action);

        console.log('finish:', action);

    }

    function compose(...funs) {

           return arg => funcs.reduceRight( (compose, f) => f(composed), arg)

       }

    https://www.cnblogs.com/fe-linjin/p/10494763.html

    https://stackoverflow.com/questions/41139585/what-is-the-next-in-applymiddleware

    ...middlewares (arguments): 遵循 Redux middleware API 的函数。每个 middleware 接受 StoredispatchgetState 函数作为命名参数,并返回一个函数。该函数会被传入 被称为 next 的下一个 middleware 的 dispatch 方法,并返回一个接收 action 的新函数,这个函数可以直接调用 next(action),或者在其他需要的时刻调用,甚至根本不去调用它。调用链中最后一个 middleware 会接受真实的 store 的 dispatch 方法作为 next 参数,并借此结束调用链。所以,middleware 的函数签名是 ({ getState, dispatch }) => next => action。

    https://www.redux.org.cn/docs/api/applyMiddleware.html

  • 相关阅读:
    2.SpringMVC入门
    1.SpringMVC回顾MVC
    10.spring声明式事务
    9.spring整合Mybatis
    maven项目的classpath路径对应的文件目录
    8.spring中的AOP
    Java通过反射破解单例模式和防止反射破解单例模式案例
    7.代理模式
    让Java项目默认使用jdk8等级进行编译
    return false取消手机移动端的默认设置
  • 原文地址:https://www.cnblogs.com/feng9exe/p/11175413.html
Copyright © 2011-2022 走看看