js的组合函数

1.组合函数即由若干个函数组合成一个新的函数,同时完成数据的传递

1>最简单版本

  这种方法实现的组合函数,需要我们指定函数的执行顺序

/**第一种方法 */
function add(a, b) {
    return a + b;
}
function square(a) {
    return a * a;
}

function compose(fn1, fn2) {
    return (...args) => fn1(fn2(...args));
}


console.log(compose(square, add)(1, 2));

2>升级版本

  此种方法可以顺序执行我们输入的函数


  /**第二种方法 可以按照顺序执行*/
function compose2(mids) {
    return (...args) => {
        let ret = mids[0](...args);
        for (let i = 1; i < mids.length; i++) {
            ret = mids[i](ret);
        }
        return ret;
    }
}
console.log(compose2([add, square])(1, 2));

3>当我们的某些函数需要异步执行的时候,可以使用下面的方法,用next来完成函数的下一步操作  (类似于koa异步函数的实现过程)

    思路:异步的实现需要借助Promise,函数必须返回一个Promise

function sleep() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        }, 2000);
    })
}
async function fn1(next) {
    console.log('fn1');
    setTimeout(() => {
        console.log('fn1 settimeout');

    }, 1000);
    await next();
    console.log('end fn1');
}
async function fn2(next) {
    console.log('fn2');
    await sleep();
    await next();
    console.log('end fn2');
}
async function fn3(next) {
    console.log('end fn3');
}

function compose(mids) {
    return function () {//最终组合结果函数
        //执行第0个
        return dispatch(0);
        //需要返回Promise
        function dispatch(i) {
            let fn = mids[i];
            if (!fn) {
                //执行任务结束
                return Promise.resolve();
            }
            return Promise.resolve(fn(function next() {
                return dispatch(i + 1);
            }));
        }
    }
}

compose([fn1, fn2, fn3])().then(() => console.log("任务执行结束"));

最终的执行结果是: 

fn1
fn2
fn1 settimeout
end fn3
end fn2
end fn1

posted @ 2019-04-17 11:50  yinping  阅读(2595)  评论(0编辑  收藏  举报