理解什么是函数组合
1.无组合状态
async function fn1(next){
console.log('fn1')
console.log('end fn1')
}
async function fn2(next){
console.log('fn2')
console.log('end fn2')
}
function fn3(next){
console.log('fn3')
}
fn1(fn2(fn3()))
2.两个函数的组合
async function fn1(next){
console.log('fn1')
next && await next()
console.log('end fn1')
}
async function fn2(next){
console.log('fn2')
next && await next()
console.log('end fn2')
}
fn1(fn2)
3.3个或以上组合状态
async function fn1(next){
console.log('fn1')
next && await next()
console.log('end fn1')
}
async function fn2(next){
console.log('fn2')
next && await next()
console.log('end fn2')
}
async function fn3(next){
console.log('fn3')
next && await next()
console.log('fn3')
}
async function fn4(next){
console.log('fn4')
next && await next()
console.log('fn4')
}
fn1(() => fn2(() => fn3(fn4)))
实战
const add = (x,y) => x + y
const square = (x) => x * x
const res = square( add(1,2))
console.log(res)
const compose = (fn1,fn2) => {
return (...args) => {
return fn2(fn1(...args))
}
}
const composeFn = compose(add,square)
console.log(composeFn(1,2))
const composeMore = (...[first,...other]) => (...args) => {
let ret = first(...args)
other.forEach( (fn) => {
ret = fn(ret)
})
return ret;
}
const composeMoreFn = composeMore(add,square)
console.log(composeMoreFn(1,2))
function composePromise(middlewares) {
console.log("composePromise")
return function () {
return dispatch(0);
function dispatch(i) {
let fn = middlewares[i];
console.log("i",i,fn)
if(!fn){
return Promise.resolve();
}
return Promise.resolve(
fn( function next() {
return dispatch(i + 1)
})
)
}
}
}
async function fn1(next){
console.log('fn1')
await next()
console.log('end fn1')
}
async function fn2(next){
console.log('fn2')
await delay()
await next()
console.log('end fn2')
}
function fn3(next){
console.log('fn3')
}
function delay(){
return Promise.resolve(res => {
setTimeout(() => reslove(),2000)
})
}
const middlewares = [fn1,fn2,fn3]
const finalFn = composePromise(middlewares)
finalFn()