Redux API compose

前言

在compose里面調(diào)用了Array.prototype.reduce方法,首先來分析一下這個方法的作用,詳細可以查看reduce文檔;

reduce

reduce方法,是從左向右,對數(shù)組中的每個元素按照傳入回調(diào)函數(shù)和初始值進行運算;舉個栗子:

let arr = [1,2,3,4,5];
let result = arr.reduce((a,b)=>{
    return a+b;
});
console.log(result);

這個栗子最終會輸出

15

即相當(dāng)于做了以下的運算:

((((1+2)+3)+4)+5)

即相當(dāng)于;

let arr = [1,2,3,4,5];
let add = (a,b)=>{
    console.log(`${a}+$=`,a + b);
    return a+b;
}
let result = arr.reduce((a,b)=>{
    return add(a,b);
});
console.log(result);

有意思的事情

下面來看一個模擬redux插件的實現(xiàn)方式

let mynext = function(action){
    console.log(action);
}
let wrapper0 = next=>action=>{
    console.log('before');
    let result = next(action);
    console.log('after');
    return result;
}

let wrapper1 = next=>action=>{
    console.log('w1 before');
    let result = next(action);
    console.log('w1 after');
    return result;
}

let wrapper2 = next=>action=>{
    console.log('w2 before');
    let result = next(action);
    console.log('w2 after');
    return result;
}

let result = compose(wrapper0,wrapper1,wrapper2);
console.log(result(mynext)('hello'));

最終輸出結(jié)果

compose.png

看到結(jié)果是不是很驚訝,這個就類似redux的中間件調(diào)用過程了,中間的是原始的store.dispatch,外面是各個插件wrapper2 ... 等的輸出結(jié)果。其實這就是redux實現(xiàn)插件的內(nèi)部機制。

compose源碼解析

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)))
}

以上是ES6的源碼,在redux的lib文件夾下,有一份編譯好的ES5的源碼,如下


function compose() {
  for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
    funcs[_key] = arguments[_key];
  }

  if (funcs.length === 0) {
    return function (arg) {
      return arg;
    };
  }

  if (funcs.length === 1) {
    return funcs[0];
  }

  return funcs.reduce(function (a, b) {
    return function () {
      return a(b.apply(undefined, arguments));
    };
  });
}

來看一下compose做了什么事情:

  1. 將arguments轉(zhuǎn)化為數(shù)組;
  2. 在數(shù)組上,調(diào)用reduce方法,數(shù)組的內(nèi)部是function,并且最終返回一個function;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容