/** * middleware 必须是 函数数组 */ functioncompose (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!') }
/** * @param {Object} context * @return {Promise} * @apipublic */ // 这个函数就是中间件实际处理函数 // app.use((ctx, next) => ...); 其中next就是下面的dispatch方法 // 这个dispatch 会调用middleware对应的那个方法 // next 上文中middlerFn的第二个参数,也就是说执行完middleware之后可以执行自定义逻辑 returnfunction (context, next) { // 默认 index是 -1 表示未执行的状态 let index = -1 // 执行第一个middlerwaree returndispatch(0) functiondispatch (i) { // 出现index = i的场景 某一个中间件里调用了两次next函数 if (i <= index) returnPromise.reject(newError('next() called multiple times')) // 赋值index; index = i // 找到middleware方法 let fn = middleware[i] // 执行完middleware了,看一下next有没有传,如果有传在走一遍逻辑 if (i === middleware.length) fn = next // 如果没有middleware 返回一个空的promise(其实并没有什么,执行到这里时 中间件已经全部走完了,resolve表示回到第一个中间件的next,执行后续代码) if (!fn) returnPromise.resolve() try { // 依次向下调用 returnPromise.resolve(fn(context, dispatch.bind(null, i + 1))) } catch (err) { returnPromise.reject(err) } } } }