next
是函数,返回的是promise
。
app.use(async (ctx, next) => {
console.log(1);
await next();
console.log(2);
});
use
把函数放进this.middleware
中,
listen
时,compose
是koa-compose
,转换。
class Application extends Emitter {
// 代码有简化组合
listen(){
const fnMiddleware = compose(this.middleware);
fnMiddleware(ctx).then(handleResponse).catch(onerror);
},
use(fn){
this.middleware.push(fn);
return this;
}
}
koa-compose
源码
function compose (middleware) {
// 校验middleware 是数组和数组每一项都是函数的校验
if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')
for (const fn of middleware) {
if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')
}
return function (context, next) {
// last called middleware #
let index = -1
return dispatch(0)
function dispatch (i) {
if (i <= index) return Promise.reject(new Error('next() called multiple times'))
index = i
let fn = middleware[i]
if (i === middleware.length) fn = next
if (!fn) return Promise.resolve()
try {
return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
} catch (err) {
return Promise.reject(err)
}
}
}
}
移除一些校验和报错代码翻译下就是这样,也就是常说的洋葱模型。
// simpleKoaCompose
const [fn1, fn2, fn3] = this.middleware;
const fnMiddleware = function(context){
return Promise.resolve(
fn1(context, function next(){
return Promise.resolve(
fn2(context, function next(){
return Promise.resolve(
fn3(context, function next(){
return Promise.resolve();
})
)
})
)
})
);
};
fnMiddleware(ctx).then(handleResponse).catch(onerror);
具体源码可以看我这篇文章。
若川:学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理
问题内容: Python中的“使用EAFP原理”是什么意思?你能提供一些例子吗? 问题答案: 一个示例是尝试访问字典键。 EAFP: LBYL:
本文向大家介绍overflow的原理是什么?相关面试题,主要包含被问及overflow的原理是什么?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 要讲清楚这个解决方案的原理,首先需要了解块格式化上下文,A block formatting context is a part of a visual CSS rendering of a Web page. It is the region
CDN的原理是什么?这是一道前端面试非常高频的面试题,但是很多同学在面试时候只能说出个大概,老规矩,点赞收藏支持一下,给我一分钟,理想哥教大家该怎么满分回答这个问题 如果我是求职者,我会这么回答: 目前的互联网应用中都包含大量的静态内容,如果不做任何处理,所有的请求都指向源站服务器的话,不仅会耗费大量的带宽,还会拖累页面加载速度,影响用户体验。 CDN服务的出现可以解决上述问题。CDN的本质仍然是
本文向大家介绍你知道koa的中间件原理吗?相关面试题,主要包含被问及你知道koa的中间件原理吗?时的应答技巧和注意事项,需要的朋友参考一下 如果一个koa中间件执行的时候,里面没有await next()的话,那么后面的中间件都不会执行。。 其实是支持普通函数的,不一定非得,可以如下使用 顺便贴下我的文章^_^ 若川:学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理
本文向大家介绍什么是batch normalization,原理是什么?相关面试题,主要包含被问及什么是batch normalization,原理是什么?时的应答技巧和注意事项,需要的朋友参考一下 Batch Normalization就是在训练过程,每一层输入加一个标准化处理。 深度神经网络之所以复杂有一个原因就是由于在训练的过程中上一层参数的更新使得每一层的输入一直在改变。所以有个办法就是去
问题内容: 假设您有一个简单的代码块,如下所示: 此函数有两个参数和,分别代表请求和响应对象。 另一方面,其他函数的第三个参数称为。例如,让我们看下面的代码: 我不明白这是什么意思或为什么要使用它。在该示例中,如果id不存在,那么实际上在做什么? 问题答案: 它将控制权传递到下一个 匹配的 路由。例如,在您给出的示例中,您可能会在数据库中查找用户(如果给出了),然后将其分配给。 在下面,您可能会有