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!") } returnfunction (context, next) { // 采用闭包将索引缓存,来实现调用计数 let index = -1 returndispatch(0) functiondispatch(i) { // 防止next()方法重复调用 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 { // 包装next()返回值为Promise对象 returnPromise.resolve(fn(context, dispatch.bind(null, i + 1))) } catch (err) { // 异常处理 returnPromise.reject(err) } } } }
两个字:优雅。有时不得不感慨人和人的差距有时比人和狗的差距还大。
拿这个 🌰 来说:
functionwait(ms) { returnnewPromise((resolve) =>setTimeout(resolve, ms || 1)) }