use (fn) { if (typeof fn !== 'function') throw new TypeError('middleware must be a function!') debug('use %s', fn._name || fn.name || '-') this.middleware.push(fn) return this }
function compose (middleware) { //接受中间件数组 ... 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')) //每个next只能一次调用 index = i let fn = middleware[i] if (i === middleware.length) fn = next //如果参数中有回调函数则放入最里层 if (!fn) return Promise.resolve() //i> try { return Promise.resolve(fn(context, dispatch.bind(null, i + 1))); //这里的bind方法相当于()=>dispatch(i+1) } catch (err) { return Promise.reject(err) } } } ... }