osharper
6/15/2017 - 5:23 PM

Middleware solution for https://github.com/kolodny/exercises/tree/master/middleware

var store = this;

class Middleware {
  constructor() {
    this.stages = [];
  }

  use(stage) {
    this.stages.push(stage);
  }
  
  go(callback) {
    var executeStage = (idx) => {
      console.log(idx);
      if (idx === this.stages.length) {
        if (callback) callback();
        return;
      }
      
      var stage = this.stages[idx];
      
      stage.call(stage, (err) => {
        if (err) {
          if (callback) callback(err);
          return;
        }
        
        idx++;
        executeStage(idx);
      });
    };
    executeStage(0);
  }
}

var middleware = new Middleware();

middleware.use(function(next) {
  setTimeout(function() {
    console.log('hook1');
    store.hook1 = true;
    next();
  }, 10000);
});

middleware.use(function(next) {
  setTimeout(function() {
    console.log('hook2');
    store.hook2 = true;
    next();
  }, 10);
});

console.log(middleware.stages);

var start = new Date();
middleware.go(function() {
  console.log(store.hook1); // true
  console.log(store.hook2); // true
  console.log(new Date() - start); // around 20
});