zoukankan      html  css  js  c++  java
  • redux中的compose源码分析

    1. redux中compose用来组合各种中间件来实现链式调用,例子如下

    1 compose(
    2          applyMiddleware,
    3          devTools,
    4          persistState,
    5          createStore
    6      )

    2. 再来看看compose的源码, 分别写了ES6 和 ES5两个版本

     1 // ES6
     2 export default function compose(...funcs) {
     3     if (funcs.length === 0) {
     4       return arg => arg
     5     }
     6   
     7     if (funcs.length === 1) {
     8       return funcs[0]
     9     }      
    10   
    11     return funcs.reduce((a, b) => (...args) => a(b(...args)))
    12   }
    13 
    14  // ES5
    15  function compose() {
    16     for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
    17       funcs[_key] = arguments[_key];
    18     }
    19   
    20     if (funcs.length === 0) {
    21       return function (arg) {
    22         return arg;
    23       };
    24     }
    25   
    26     if (funcs.length === 1) {
    27       return funcs[0];
    28     }
    29   
    30     return funcs.reduce(function (a, b) {
    31       return function () {
    32         return a(b.apply(undefined, arguments));
    33       };
    34     });
    35   }
    36   

    3. 最主要的 funcs.reduce((a, b) => (...args) => a(b(...args))) 这句话就是把函数包成洋葱卷,一层一层调用,上一个函数的返回值作为下一个函数的参数

    4. 具体分析下每一步就是如下

     1 compose(
     2         applyMiddleware,
     3         devTools,
     4         persistState,
     5         createStore
     6     )
     7 1.第一次运行后
     8     a 为:
     9     functin(){
    10         return applyMiddleware(devTools(...args))
    11     }
    12     b 为:  devTools
    13  
    14 2.第二次运行
    15     a 为:
    16     functon(){
    17         return  applyMiddleware(devTools(...args))( persistState(...args) )
    18     }
    19     
    20     b 为:  persistState
    21  
    22 3.第三次运行
    23     a 为:
    24     functon(){
    25         return  applyMiddleware(devTools(...args))( persistState(...args) )( createStore(...args) )
    26     }
    27     b 为: createStore
    28  
    29 可以看见最终返回一个函数:    
    30     applyMiddleware( devTools(...args) ) (  persistState(...args) ) (  createStore(...args) )
  • 相关阅读:
    C++读取XML,开进程,开线程
    WinRT 异步模型
    记一个宣告失败的项目Metro VS2012RC的感性认识
    [翻译]深入理解Win32结构化异常处理(四)
    Google Test 测试架构探究
    .NET FrameWork 技术内幕
    [翻译]深入理解Win32结构化异常处理(三)
    谈一谈软件开发
    ExecutionContext & SynchronizationContext
    软件制作:QQPenguin辅助工具
  • 原文地址:https://www.cnblogs.com/ZengYunChun/p/9685079.html
Copyright © 2011-2022 走看看