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!"); }
// 返回一个dispatch函数,dispatch会返回内部 Promosie.resolve,可以通过.then方法接收 returnfunction(context, next) { // last called middleware # let index = -1; return dispatch(0); // 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(); try { // 递归执行 returnPromise.resolve(fn(context, dispatch.bind(null, i + 1))); } catch (err) { returnPromise.reject(err); } } }; }