Redux之compose
生活随笔
收集整理的這篇文章主要介紹了
Redux之compose
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
在前面的基礎篇中我們講解了createStore,bindActionCrearoes,combineReducers,在高級篇講解了applyMiddleware,致此redux相關的5個API就剩下一個compose,之所以把compose單獨寫一篇文章的原因是因為是compose五個API里唯一一個能單獨拿出來用的函數,就是函數式編程里常用的組合函數,和 redux 本身沒有什么多大關系。
compose的作用
把復雜的多函數嵌套調用,組合成純粹的函數調用,實現fn1(fn2(fn3(fn3(...args))))-->compose(fn1,fn2,fn3,fn4)(...args)這樣單純可讀的函數調用方式
舉例說明
let { compose } = require('redux'); function add1(str) {return '1' + str; } function add2(str) {return '2' + str; } function add3(str) {return '3' + str; } function add4(str) {return '4' + str; } let result = add1(add2(add3(add4('GuYan')))); console.log(result); // '1234GuYan' console.log(compose(add1,add2,add3,add4)('GuYan')); // '1234GuYan' 復制代碼- 執行分析
- 【1】componse執行返回一個函數
- 【2】componse的參數為函數,返回的函數執行的時候實現了參數函數從右向左依次執行且每一個參數函數執行的結果為下一參數函數執行的入參,返回函數執行傳入的參數作為第一次執行的參數函數的入參
- 源碼實現
相信大家一定可以讀懂前面的源碼實現了(如果有不明白的地方歡迎下方留言),但是細心的朋友們會發現真正的源碼的實現并不是用reduceRight而是reduce,所以我們結合源碼分析一遍我們的例子中代碼的執行過程
源碼分析
export default function compose(...funcs) {if (funcs.length === 0) {return arg => arg}if (funcs.length === 1) {return funcs[0]}return funcs.reduce((a, b) => (...args) => a(b(...args))) } 復制代碼上面代碼片段是我直接從源碼中拷貝過來的,為了方便講解我們將箭頭函數修改成普通函數形式,結果如下
export default function compose(...funcs) {// 前兩種我就不復述了return funcs.reduce(function (a,b) {return function (...args) {return a(b(...args))}}) } 復制代碼- 結合示例
- 第一次迭代
- 參數:add1,add2
- 返回function fn1(...args1){return add1(add2(...args1))}
- 第二次迭代
- 參數:function fn1(...args1){return add1(add2(...args1))},add3
- 返回:function fn2(...args2){return (function fn1(...args1){return add1(add2(...args1))})(add3(...args2))}
- 第三次迭代
- 參數:function fn2(...args2){return (function fn1(...args1){return add1(add2(...args1))})(add3(...args2))},add4
- 返回:function fn3(...args3) {return (function fn2(...args2) {return (function fn1(...args1) {return add1(add2(...args1))})(add3(...args2))})(add4(...args3))}
- 第一次迭代
| 第一次 | add1 | add2 | (...args1)=>(add1(add2(...args1))) |
| 第二次 | (...args1)=>(add1(add2(...args1))) | add3 | (...args2)=>((...args1)=>(add1(add2(...args1))))(add3(...args2))即(...args2)=>add1(add2(add3(...args2))) |
| 第三次 | (...args)=>(add1(add2(add3(...args)))) | add4 | (...args3)=>((...args2)=>(add1(add2(add3(...args)))))(add4(...args3))即(...args)=>add1(add2(add3(add4(...args)))) |
轉載于:https://juejin.im/post/5ce973df51882521d51ec73b
總結
以上是生活随笔為你收集整理的Redux之compose的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络命令学习笔记
- 下一篇: (十二)java版电子商务spring