Explain the function Middleware











up vote
1
down vote

favorite












Can anybody give me tutorial how this function is working i am not able to understand how this function is working. How this.go function actually working. Any Help would be appreciated. Thanks



var Middleware = function() {};

Middleware.prototype.use = function(fn) {
var self = this;

this.go = (function(stack) {
return function(next) {
stack.call(self, function() {
fn.call(self, next.bind(self));
});
}.bind(this);
})(this.go);
};

Middleware.prototype.go = function(next) {
next();
};


USAGE



var middleware = new Middleware();

middleware.use(function(next) {
var self = this;
setTimeout(function() {
self.hook1 = true;
console.log('a')
next();
}, 10);
});

middleware.use(function(next) {
var self = this;
setTimeout(function() {
self.hook2 = true;
console.log('b')
next();
}, 10);
});

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









share|improve this question


























    up vote
    1
    down vote

    favorite












    Can anybody give me tutorial how this function is working i am not able to understand how this function is working. How this.go function actually working. Any Help would be appreciated. Thanks



    var Middleware = function() {};

    Middleware.prototype.use = function(fn) {
    var self = this;

    this.go = (function(stack) {
    return function(next) {
    stack.call(self, function() {
    fn.call(self, next.bind(self));
    });
    }.bind(this);
    })(this.go);
    };

    Middleware.prototype.go = function(next) {
    next();
    };


    USAGE



    var middleware = new Middleware();

    middleware.use(function(next) {
    var self = this;
    setTimeout(function() {
    self.hook1 = true;
    console.log('a')
    next();
    }, 10);
    });

    middleware.use(function(next) {
    var self = this;
    setTimeout(function() {
    self.hook2 = true;
    console.log('b')
    next();
    }, 10);
    });

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









    share|improve this question
























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      Can anybody give me tutorial how this function is working i am not able to understand how this function is working. How this.go function actually working. Any Help would be appreciated. Thanks



      var Middleware = function() {};

      Middleware.prototype.use = function(fn) {
      var self = this;

      this.go = (function(stack) {
      return function(next) {
      stack.call(self, function() {
      fn.call(self, next.bind(self));
      });
      }.bind(this);
      })(this.go);
      };

      Middleware.prototype.go = function(next) {
      next();
      };


      USAGE



      var middleware = new Middleware();

      middleware.use(function(next) {
      var self = this;
      setTimeout(function() {
      self.hook1 = true;
      console.log('a')
      next();
      }, 10);
      });

      middleware.use(function(next) {
      var self = this;
      setTimeout(function() {
      self.hook2 = true;
      console.log('b')
      next();
      }, 10);
      });

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









      share|improve this question













      Can anybody give me tutorial how this function is working i am not able to understand how this function is working. How this.go function actually working. Any Help would be appreciated. Thanks



      var Middleware = function() {};

      Middleware.prototype.use = function(fn) {
      var self = this;

      this.go = (function(stack) {
      return function(next) {
      stack.call(self, function() {
      fn.call(self, next.bind(self));
      });
      }.bind(this);
      })(this.go);
      };

      Middleware.prototype.go = function(next) {
      next();
      };


      USAGE



      var middleware = new Middleware();

      middleware.use(function(next) {
      var self = this;
      setTimeout(function() {
      self.hook1 = true;
      console.log('a')
      next();
      }, 10);
      });

      middleware.use(function(next) {
      var self = this;
      setTimeout(function() {
      self.hook2 = true;
      console.log('b')
      next();
      }, 10);
      });

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






      javascript middleware






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 10 at 14:36









      Aman Bansal

      12026




      12026
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          The purpose of this code seems to be to build up a sequence of functions, which will then be run one after the other.



          The go method's job is to run some code. If you've never called use, then go will run the specified code immediately, with no complications.



          The use method lets you insert additional steps to be run. When you call use, the original go method is replaced with a new method. That new method will call the old go method, followed by your custom method. If use is called multiple times, this builds up a sequence of functions. The functions will be called in the order they were passed in to use. The next function starts running when the previous function calls next().





          A lot of the complication of the code comes from making sure that the value of this stays what it's expected to be. If that wasn't a requirement, then use could be rewritten like this:



          Middleware.prototype.use = function(fn) {
          const oldGo = this.go;
          this.go = next => oldGo(() => fn(next))
          }





          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














             

            draft saved


            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239996%2fexplain-the-function-middleware%23new-answer', 'question_page');
            }
            );

            Post as a guest
































            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            The purpose of this code seems to be to build up a sequence of functions, which will then be run one after the other.



            The go method's job is to run some code. If you've never called use, then go will run the specified code immediately, with no complications.



            The use method lets you insert additional steps to be run. When you call use, the original go method is replaced with a new method. That new method will call the old go method, followed by your custom method. If use is called multiple times, this builds up a sequence of functions. The functions will be called in the order they were passed in to use. The next function starts running when the previous function calls next().





            A lot of the complication of the code comes from making sure that the value of this stays what it's expected to be. If that wasn't a requirement, then use could be rewritten like this:



            Middleware.prototype.use = function(fn) {
            const oldGo = this.go;
            this.go = next => oldGo(() => fn(next))
            }





            share|improve this answer

























              up vote
              0
              down vote













              The purpose of this code seems to be to build up a sequence of functions, which will then be run one after the other.



              The go method's job is to run some code. If you've never called use, then go will run the specified code immediately, with no complications.



              The use method lets you insert additional steps to be run. When you call use, the original go method is replaced with a new method. That new method will call the old go method, followed by your custom method. If use is called multiple times, this builds up a sequence of functions. The functions will be called in the order they were passed in to use. The next function starts running when the previous function calls next().





              A lot of the complication of the code comes from making sure that the value of this stays what it's expected to be. If that wasn't a requirement, then use could be rewritten like this:



              Middleware.prototype.use = function(fn) {
              const oldGo = this.go;
              this.go = next => oldGo(() => fn(next))
              }





              share|improve this answer























                up vote
                0
                down vote










                up vote
                0
                down vote









                The purpose of this code seems to be to build up a sequence of functions, which will then be run one after the other.



                The go method's job is to run some code. If you've never called use, then go will run the specified code immediately, with no complications.



                The use method lets you insert additional steps to be run. When you call use, the original go method is replaced with a new method. That new method will call the old go method, followed by your custom method. If use is called multiple times, this builds up a sequence of functions. The functions will be called in the order they were passed in to use. The next function starts running when the previous function calls next().





                A lot of the complication of the code comes from making sure that the value of this stays what it's expected to be. If that wasn't a requirement, then use could be rewritten like this:



                Middleware.prototype.use = function(fn) {
                const oldGo = this.go;
                this.go = next => oldGo(() => fn(next))
                }





                share|improve this answer












                The purpose of this code seems to be to build up a sequence of functions, which will then be run one after the other.



                The go method's job is to run some code. If you've never called use, then go will run the specified code immediately, with no complications.



                The use method lets you insert additional steps to be run. When you call use, the original go method is replaced with a new method. That new method will call the old go method, followed by your custom method. If use is called multiple times, this builds up a sequence of functions. The functions will be called in the order they were passed in to use. The next function starts running when the previous function calls next().





                A lot of the complication of the code comes from making sure that the value of this stays what it's expected to be. If that wasn't a requirement, then use could be rewritten like this:



                Middleware.prototype.use = function(fn) {
                const oldGo = this.go;
                this.go = next => oldGo(() => fn(next))
                }






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 10 at 15:17









                Nicholas Tower

                6,2451715




                6,2451715






























                     

                    draft saved


                    draft discarded



















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239996%2fexplain-the-function-middleware%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest




















































































                    Popular posts from this blog

                    Xamarin.iOS Cant Deploy on Iphone

                    Glorious Revolution

                    Dulmage-Mendelsohn matrix decomposition in Python