Ajay Singh Beniwal
Ajay Singh Beniwal

Reputation: 19037

SetTimeout Executing faster then assigned interval

I have assigned 5000 ms to Settimeout but it is executing before assigned time interval.Can any body explain why it is happening.

<script type="text/javascript">
        var getcallback = {
            closure: function (callback, functionparam) {
                return callback.call(functionparam);
            }
        }
        var cleartimeout;
        var startSlideShow =  {
            timerid: 5000,
            startAnimation: function () {
                cleartimeout = setTimeout(getcallback.closure(function () {
                    alert("this is a basic example of chaining methods");
                    this.startAnimation();
                },this), this.timerid);
            },
            stopAnimation:function(){
            }
        }
        startSlideShow.startAnimation();

    </script>

Upvotes: 0

Views: 193

Answers (2)

voithos
voithos

Reputation: 70552

As soon as you call startAnimation, you're calling getcallback.closure, which immediately calls the callback function. To use setTimeout correctly, you need to either have closure return a function, or not use such a strange thing, and instead just use an anonymous function.

Something along the lines of:

var getcallback = {
    closure: function (callback, functionparam) {
        return function() {
            callback.call(functionparam);
        };
    }
}

...

Or, to be cleaner, just:

var cleartimeout;
var startSlideShow =  {
    timerid: 5000,
    startAnimation: function () {
        cleartimeout = setTimeout(function () {
            alert("this is a basic example of chaining methods");
            this.startAnimation();
        }, this.timerid);
    },
    stopAnimation:function(){
    }
}
startSlideShow.startAnimation();

Upvotes: 1

epascarello
epascarello

Reputation: 207501

Because getcallback.closure() is executing the function right away, you are not storing a reference to a function to call at a later time.

Upvotes: 1

Related Questions