functioncompose (middleware) { ... returnfunction (context, next) { // last called middleware # let index = -1 return dispatch(0) functiondispatch (i) { // 判断当前中间件是否运行了多次 if (i <= index) returnPromise.reject(newError('next() called multiple times')) index = i // 获取当前中间件函数 let fn = middleware[i] // compose函数支持扩展中间件,通过next,在最后插入其他中间件。 if (i === middleware.length) fn = next if (!fn) returnPromise.resolve() try { // 在这里执行中间件,并将下一个中间件的dispatch函数绑定后传入,由其控制。 returnPromise.resolve(fn(context, dispatch.bind(null, i + 1))); } catch (err) { // 中间件运行报错 returnPromise.reject(err) } } } }