Skip to content

koa洋葱模型核心函数(compose) #84

Open
@dcharlie123

Description

@dcharlie123
function compose(middleware) {
  // 判断是否是数组
  if (!Array.isArray(middleware)) {
    return;
  }
  // 判断每个中间件是否是函数
  for (const fn of middleware) {
    if (typeof fn !== "function") throw new Error("err");
  }
  return function (context, next) {
    let index = -1;
    function dispatch(i) {
      // 防止next在同个中间件多次调用
      if(i<=index) return Promise.reject(new Error('next() called multipe times'))
      index = i;
      let fn = middleware[index];
      if (index === middleware.length) {
        fn = next;
      }
      if (!fn) return Promise.resolve();
      try {
        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));
      } catch (err) {
        return Promise.reject(err);
      }
    }
    return dispatch(0);
  };
}
function a(window,next){
  console.log('1b')
  next()
  next()
  console.log('1a')
}
function b(window,next){
  console.log(2)
  next()
  console.log(3)
}
let fns=compose([a,b])
fns().then(()=>{console.log('over')})

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions