wang1dot0 / personal-note

记录工作中遇到的个人觉得比较有意思的小问题
https://github.com/wang1dot0/personal-note
0 stars 0 forks source link

koa-compose插件的实现分析 #38

Open wang1dot0 opened 4 years ago

wang1dot0 commented 4 years ago

在koa类中维护了一个middleware数组,每次使用app.use增加一个中间件,它就简单的,讲中间件推入middleware数组中,尔后在服务器callback函数中使用了compose(middleware)。那么这个compose函数做了哪些操作呢:

function compose(middleware) {
  if (!Array.isArray(middleware)) {
    throw 'middleware set must be an Array';
  }
  for (const fn of middleware) {
    if (typeof fn !== 'function') {
      throw 'middleware fn must be a function';
    }
  }
  return function(context, next) {
    let index = -1;
    return dispatch(0);

    function dispatch(i) {
      if (index > i) return Promise.reject('next cannot be exec twicely');
      index = i;
      let fn = middleware[i];
      if (i === middleware.length) fn = next;
      if (!fn) return Promise.resolve();
      try {
        return Promise.resolve(fn(context, function next() {
          return dispatch(i + 1);
        }));
      } catch (err) {
        return Promise.reject(err);
      }
    }
  }
}