// koa-compose/index.js functioncompose(middleware) { // middleware 函数数组 if (!Array.isArray(middleware)) thrownewTypeError('Middleware stack must be an array!') for (const fn of middleware) { if (typeof fn !== 'function') thrownewTypeError('Middleware must be composed of functions!') } /* content:上下文 next:新增一个中间件方法,位于所有中间件末尾,用于内部扩展 */ returnfunction (context, next) { // last called middleware # let index = -1// 计数器,用于判断中间是否执行到最后一个 returndispatch(0) // 开始执行第一个中间件方法 functiondispatch(i) { if (i <= index) returnPromise.reject(newError('next() called multiple times')) index = i let fn = middleware[i] // 获取中间件函数 if (i === middleware.length) fn = next // 如果中间件已经到了最后一个,执行内部扩展的中间件 if (!fn) returnPromise.resolve() // 执行完毕,返回 Promise try { // 执行 fn ,将下一个中间件函数赋值给 next 参数,在自定义的中间件方法中显示的调用 next 函数,中间件函数就可串联起来了 returnPromise.resolve(fn(context, dispatch.bind(null, i + 1))); } catch (err) { returnPromise.reject(err) } } } }