洋葱模型


Koa 的洋葱模型指的是以 next() 函数为分割点,先由外到内执行 Request 的逻辑,再由内到外执行 Response 的逻辑。通过洋葱模型,将多个中间件之间通信等变得更加可行和简单。其实现的原理并不是很复杂,主要是 compose 方法。

同步版本

;(()=>{
    function compose(middlewares) {
        let index = -1;

        if (Array.isArray(middlewares)) {
            return ()=>dispatch(0);
        }

        function dispatch(i) {
            if (i <= index)
                return new Error('next() called multiple times')

            index = i;
            let fn = middlewares[i];

            if (fn) {
                return fn(function next() {
                    // 将下一个待执行的函数作为参数传入到当前函数的参数之中
                    return dispatch(i + 1); 
                })
            }

        }
    }

    const fn1 = (next)=>{
        console.log(1)
        next();
        console.log(2)
    }

    const fn2 = (next)=>{
        console.log(3)
        next();
        console.log(4)
    }

    const fn3 = (next)=>{
        console.log(5)
        next()
        console.log(6)
    }

    const middlewares = [fn1, fn2, fn3];

    const a = compose(middlewares)

    a();
}
)();

JhVEuRI.md.jpg