In javascript when I create an interval, I want to stop the interval from inside the function, but I don't want to reference the ID value from outside like this
var y = setInterval(function(){ clearInterval(y); }, 1000);
What I want is to pass a variable similar to this style
setTimeout(function(data){alert(data);}, 1000, "data");
This works for setInterval too, except I can't really pass the id value that's returned by the setInterval function, because it gets created after calling it.
Right now I'm doing a hack like this:
var r = [];
var y = setInterval(function(r){ if (r.length==1) { clearInterval(r[0]); } }, 1000, r);
r.push(y);
Does anyone know the right way?
Thanks
The setInterval() method calls a function or evaluates an expression at specified intervals (in milliseconds). The setInterval() method will continue calling the function until clearInterval() is called, or the window is closed.
The JavaScript setInterval () method returns an ID which can be used by the clearInterval () method to stop the interval. If you only need to execute a function one time, use the setTimeout () method.
`CODE/FUNCTION` is the code, action or function we want to fire after the specified delay `INTERVAL` is the delay or interval time we want to wait to fire code. DELAY value is specified in milliseconds which means to wait 3 seconds we should provide 3000 to the setInterval () function.
Please, don't pass a string to setInterval, JS functions are first-class objects, so they can be passed as arguments, assigned to variables or returned by other functions. In your example, I'd write the following:
You have to use the return value, but that doesn't mean that the variable needs to be accessible to anything else; just encapsulate:
(function() {
var y = setInterval(function(){ clearInterval(y); }, 1000);
})();
y
in the above is only accessible within the outer anonymous function, which only has the interval function and nothing else in it.
You could even give yourself a reusable setInterval
wrapper to do it:
function setIntervalWrapper(callback, time) {
var args = Array.prototype.slice.call(arguments, 1);
args[0] = setInterval(function() {
callback.apply(null, args);
}, time);
}
That will pass the time handle as the first argument, in front of any others you specify. It also has the benefit of supporting those follow-on arguments reliably cross-browser (some older browsers didn't support passing arguments to the callback).
Gratuitous example:
function setIntervalWrapper(callback, time) {
var args = Array.prototype.slice.call(arguments, 1);
args[0] = setInterval(function() {
callback.apply(null, args);
}, time);
}
var counter = 0;
setIntervalWrapper(function(handle, arg1, arg2) {
console.log("Interval callback called, handle is " + handle + ", args are '" + arg1 + "' and '" + arg2 + "'");
if (++counter > 5) {
console.log("counter > 5, stopping");
clearInterval(handle);
}
}, 500, "a", "b");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With