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
本文向大家介绍你知道koa的中间件原理吗?相关面试题,主要包含被问及你知道koa的中间件原理吗?时的应答技巧和注意事项,需要的朋友参考一下 如果一个koa中间件执行的时候,里面没有await next()的话,那么后面的中间件都不会执行。。 其实是支持普通函数的,不一定非得,可以如下使用 顺便贴下我的文章^_^ 若川:学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理
本文向大家介绍什么是batch normalization,原理是什么?相关面试题,主要包含被问及什么是batch normalization,原理是什么?时的应答技巧和注意事项,需要的朋友参考一下 Batch Normalization就是在训练过程,每一层输入加一个标准化处理。 深度神经网络之所以复杂有一个原因就是由于在训练的过程中上一层参数的更新使得每一层的输入一直在改变。所以有个办法就是去
问题内容: 假设您有一个简单的代码块,如下所示: 此函数有两个参数和,分别代表请求和响应对象。 另一方面,其他函数的第三个参数称为。例如,让我们看下面的代码: 我不明白这是什么意思或为什么要使用它。在该示例中,如果id不存在,那么实际上在做什么? 问题答案: 它将控制权传递到下一个 匹配的 路由。例如,在您给出的示例中,您可能会在数据库中查找用户(如果给出了),然后将其分配给。 在下面,您可能会有
问题内容: 就我所读的内容而言,它用于在swing应用程序中分派新线程来执行一些“后台”工作,但是使用此线程而不是“正常”线程有什么好处? 使用新线程不一样,完成后使用SwingUtilities.invokeLater调用某些GUI方法吗?… 我在这里想念什么? http://en.wikipedia.org/wiki/SwingWorker http://java.sun.com/produc