zoukankan      html  css  js  c++  java
  • 理解redux中间件

    redux questions :

    1. reducers 函数如何创建和聚合
    2. action创建函数如何如何包裹在dispatch函数中
    3. 如何给默认的dispatch方法增加中间件能力

    middleware:

    (js context)中间件由函数组合的形式创建,实现与主要执行任务正交的功能。
    tips:类似的有装饰器模式

    在 redux middleware 要装饰的主要功能是 dispatch 函数。dispatch 函数的主要功能是发送actions 给
    reducer函数来产生新的state。

    applyMiddleware.js

    1. 函数组合
        f(x) = 2x 
        g(x) = x^2+3x+1
        (f * g)(x) = f(g(x)) = f(2x) = 4x^2 + 6x + 1
        组合两个或者更多的函数,返回一个新的函数

        function compose(f,g){
            return x=>f(g(x))
        }
        从里向外求值

    2. 柯里化(curring)
        通过柯里化,可以创建一个拥有部分信息的新函数
        (bind some information)

        function curring(a){
            return b=>a+b
        }

        通过函数组合和柯里化能够为数据处理创建一个管道

    redux midddleware 被设计用来在daispatch调用之前创建组合在一起的函数。

    对dispatch的过程做包装,不改变任何值。
     1 export default function applyMiddleware(...middlewares) {
     2         return createStore => (...args) => {
     3             const store = createStore(...args)
     4             let dispatch = () => {
     5                 throw new Error(
     6                     'Dispatching while constructing your middleware is not allowed. ' +
     7                     'Other middleware would not be applied to this dispatch.'
     8                 )
     9             }
    10 
    11             const middlewareAPI = {
    12                 getState: store.getState,
    13                 dispatch: (...args) => dispatch(...args)
    14             }
    15             const chain = middlewares.map(middleware => middleware(middlewareAPI))
    16             dispatch = compose(...chain)(store.dispatch)
    17             // dispatch is the new 
    18             return {
    19             ...store,
    20             dispatch
    21             }
    22         }
    23     }
    24 
    25     //dispatch in createStore 
    26     // dispatch action and run the listener callBack
    27     function dispatch(action) {
    28         try {
    29             isDispatching = true
    30             currentState = currentReducer(currentState, action)
    31         } finally {
    32             isDispatching = false
    33         }
    34 
    35         const listeners = (currentListeners = nextListeners)
    36         for (let i = 0; i < listeners.length; i++) {
    37             const listener = listeners[i]
    38             listener()
    39         }
    40 
    41         return action
    42     }
    43 
    44 
    45     // In createStore.js, the enhance is the function returned by applyMiddleware 
    46     // return a store which dispatch is decorated
    47     enhance(createStore)(reducer,preloadState)
    48 
    49     //  example looger middleware
    50     function logger({getState})=>{
    51         return (next)=>(action)=>{
    52             // action 
    53             const returnNext = next(action)
    54             const state = getState()
    55             console.log(`${ation.type}=>${state}`)
    56             // doSomething
    57             return returnNext
    58         }
    59     }

     参考:

          https://medium.com/@meagle/understanding-87566abcfb7a

  • 相关阅读:
    18C 新的发行版和补丁模型
    单机数据库193000 升级到195000
    Mycat学习-单独启动mycat
    dstat 监控工具
    基于FTP 的本地Yum服务器配置
    记一次SQL PLUS 不能登录的异常处理
    FastDFS---分布式文件存储系统安装与使用
    ERROR
    记:一次安装Nginx的过程
    连接阿里RDS数据库
  • 原文地址:https://www.cnblogs.com/wust-hy/p/12590288.html
Copyright © 2011-2022 走看看