function compose(middleware) {
if (!Array.isArray(middleware)) {
throw 'middleware set must be an Array';
}
for (const fn of middleware) {
if (typeof fn !== 'function') {
throw 'middleware fn must be a function';
}
}
return function(context, next) {
let index = -1;
return dispatch(0);
function dispatch(i) {
if (index > i) return Promise.reject('next cannot be exec twicely');
index = i;
let fn = middleware[i];
if (i === middleware.length) fn = next;
if (!fn) return Promise.resolve();
try {
return Promise.resolve(fn(context, function next() {
return dispatch(i + 1);
}));
} catch (err) {
return Promise.reject(err);
}
}
}
}
在koa类中维护了一个middleware数组,每次使用app.use增加一个中间件,它就简单的,讲中间件推入middleware数组中,尔后在服务器callback函数中使用了compose(middleware)。那么这个compose函数做了哪些操作呢: