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