# 组合API

# 概念

其实就是把任务队列的函数,组合成一个函数调用。

比如有函数A、函数B,B的参数是A的执行结果,平时我们写法是这样的:B(A()),是不是不够优雅?你可能并不这么觉得,那么再加上五六个函数呢,得嵌套多少层?

这时组合API的作用就来了,它可以这样封装一个函数:

var func = compose(D, C, B, A);
// var func = compose(A, B, C, D);
func('abc')

参数的顺序是向左向右无所谓,统一就好。

# 实现

实现也很简单,可以使用数组的reduce

function compose(...fns) {
    return function (...args) {
        return fns.reduce(function (preItem, curFn, index) {
            if (index === 0) {
                return curFn(...preItem);
            }
            return curFn(preItem);
        }, args);
    };
}

我这个实现,是从左往右执行的,下面这个是从右往左执行:

function composeRight(...fns) {
    return function (...args) {
        var len = fns.length;
        return fns.reduceRight(function (preItem, curFn, index) {
            if (index === len - 1) {
                return curFn(...preItem);
            }
            return curFn(preItem);
        }, args);
    };
}

测试:

var toLower = function (str) {
    return str.toLowerCase();
};

var subStr = function (str) {
    return str.substr(5);
};

var addStr = function (str) {
    return 'xxx-' + str;
}

var composedFun = compose(subStr, addStr, toLower);
// var composedFun = composeRight(toLower, addStr, subStr);

var res = composedFun('FIFISISDDJFIFDAfjdjsjjs');
console.log(res);