You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
/** * Compose `middleware` returning * a fully valid middleware comprised * of all those which are passed. * * @param {Array} middleware * @return {Function} * @api public */functioncompose(middleware){if(!Array.isArray(middleware))thrownewTypeError('Middleware stack must be an array!');for(constfnofmiddleware){if(typeoffn!=='function')thrownewTypeError('Middleware must be composed of functions!');}/** * @param {Object} context * @return {Promise} * @api public */returnfunction(context,next){// last called middleware #letindex=-1;returndispatch(0);functiondispatch(i){if(i<=index)returnPromise.reject(newError('next() called multiple times'));index=i;letfn=middleware[i];if(i===middleware.length)fn=next;if(!fn)returnPromise.resolve();try{returnPromise.resolve(fn(context,dispatch.bind(null,i+1)));}catch(err){returnPromise.reject(err);}}};}
我们可以看到除去类型错误判断,代码只有短短的 10 多行...下面我们分析一哈核心代码~
functioncompose(middleware){// 返回了一个函数,接受context和next参数,koa在调用koa-compose时只传入context,所以此处next即为undefined;returnfunction(context,next){// last called middleware #// 初始化indexletindex=-1;// 从第一个中间件开始执行~returndispatch(0);// 执行函数functiondispatch(i){// 在一个中间件执行两次next函数时,抛出异常. 注解: ⭕if(i<=index)returnPromise.reject(newError('next() called multiple times'));// 设置index,作用是判断在同一个中间件中是否调用多次next函数.index=i;// 当前中间件函数letfn=middleware[i];// 跑完所有中间件时,fn = next ,即fn = undefined,可以理解为终止条件;if(i===middleware.length)fn=next;// 返回一个空值的promise对象. 注解: ⭕⭕if(!fn)returnPromise.resolve();try{// 返回一个定值的promise对象.值为下一个中间件的返回值。// 这里是最核心的逻辑,递归调用下一个中间件,并将返回值返回给上一个中间件。 注解: ⭕⭕returnPromise.resolve(fn(context,dispatch.bind(null,i+1)));}catch(err){returnPromise.reject(err);}}};}
koa-洋葱模型
koa 最大的特点就是独特的中间件流程控制,也就是大名鼎鼎的“洋葱模型”。没图说个???
我们可以很清晰的看到 一个请求从外到里一层一层的经过中间件,响应时从里到外一层一层的经过中间件。
就像我们往洋葱插入一根牙签,牙签从外到里经过一层层洋葱皮,到达"葱心",我们拔出来时,牙签从里到外经过一层一层洋葱皮。(我怀疑你在开车,但是...)
Talk is cheap,Show me the code。简单说就是,没代码说个???
下面,我们来分析一波 koa-compose 源码
我们可以看到除去类型错误判断,代码只有短短的 10 多行...下面我们分析一哈核心代码~
如果看完上面的分析,你还觉得一脸萌比的话,没关系,下面我们来通过实践再来理解一波.
1.我们首先验证一哈我们上面说的高大上的洋葱模型.
没毛病,一层一层往里进,一层一层往里出. 如果以上代码的执行结果让你感到意外和困惑..你或许该补一下 call stack 的知识了,看看这个,你就豁然开朗了.
2.我们验证一哈注解 ⭕️.
2.最后我们来验证一哈注解 ⭕️⭕️.
demo 代码
上一节:Koa 源码分析之 Use 方法
下一节:Koa 源码分析之 Context 对象
The text was updated successfully, but these errors were encountered: