functioncompose(middleware) { //传入middleware数组 if (!Array.isArray(middleware)) thrownewTypeError("Middleware stack must be an array!"); //判断middleware是否为数组 for (const fn of middleware) { //过一遍middleware,判断每个成员是否为函数 if (typeof fn !== "function") thrownewTypeError("Middleware must be composed of functions!"); }
returnfunction (context, next) { //返回一个函数 let index = -1; //index计数 return dispatch(0); //调用dispatch,传入0 functiondispatch(i) { if (i <= index) returnPromise.reject(newError("next() called multiple times")); //i小于index,证明在中间件内调用了不止一次的next(),抛出错误 index = i; //更新index的值 let fn = middleware[i]; //middleware中的函数,从第1个开始 if (i === middleware.length) fn = next; //如果i走到最后一个的后面,就让fn为next,此时fn为undefined if (!fn) returnPromise.resolve(); //那么这时候就直接resolve try { returnPromise.resolve(fn(context, dispatch.bind(null, i + 1))); //将其包装成一个Promise resolve态,主要作用是区分reject } catch (err) { returnPromise.reject(err); //catch错误,并reject } } }; }
let len = this.middlewares.length; let next = () =>Promise.resolve(); for (let i = len - 1; i >= 0; i--) { let currentMiddleware = this.middlewares[i]; next = createNext(currentMiddleware, next); } await next(); }; }
Delegator.prototype.method = function (name) { var proto = this.proto; var target = this.target; this.methods.push(name); proto[name] = function () { returnthis[target][name].apply(this[target], arguments); }; returnthis; };
target.name 包装一层函数赋值给 proto.name,也就是将 target 上的函数也能让 proto 去调用。
getter 通过defineGetter劫持 proto 的 get,转而去访问 target:
1 2 3 4 5 6 7 8 9
Delegator.prototype.getter = function (name) { var proto = this.proto; var target = this.target; this.getters.push(name); proto.__defineGetter__(name, function () { returnthis[target][name]; }); returnthis; };