How do I add a delay in a JavaScript loop?
I would like to add a delay/sleep inside a while
loop:
I tried it like this:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Only the first scenario is true: after showing alert('hi')
, it will be waiting for 3 seconds then alert('hello')
will be displayed but then alert('hello')
will be repeatedly constantly.
What I would like is that after alert('hello')
is shown 3 seconds after alert('hi')
then it needs to wait for 3 seconds for the second time alert('hello')
and so on.
javascript loops sleep
add a comment |
I would like to add a delay/sleep inside a while
loop:
I tried it like this:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Only the first scenario is true: after showing alert('hi')
, it will be waiting for 3 seconds then alert('hello')
will be displayed but then alert('hello')
will be repeatedly constantly.
What I would like is that after alert('hello')
is shown 3 seconds after alert('hi')
then it needs to wait for 3 seconds for the second time alert('hello')
and so on.
javascript loops sleep
add a comment |
I would like to add a delay/sleep inside a while
loop:
I tried it like this:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Only the first scenario is true: after showing alert('hi')
, it will be waiting for 3 seconds then alert('hello')
will be displayed but then alert('hello')
will be repeatedly constantly.
What I would like is that after alert('hello')
is shown 3 seconds after alert('hi')
then it needs to wait for 3 seconds for the second time alert('hello')
and so on.
javascript loops sleep
I would like to add a delay/sleep inside a while
loop:
I tried it like this:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Only the first scenario is true: after showing alert('hi')
, it will be waiting for 3 seconds then alert('hello')
will be displayed but then alert('hello')
will be repeatedly constantly.
What I would like is that after alert('hello')
is shown 3 seconds after alert('hi')
then it needs to wait for 3 seconds for the second time alert('hello')
and so on.
javascript loops sleep
javascript loops sleep
edited Mar 3 '18 at 16:19
halfer
14.7k759116
14.7k759116
asked Aug 27 '10 at 11:36
olidevolidev
7,01042112173
7,01042112173
add a comment |
add a comment |
24 Answers
24
active
oldest
votes
The setTimeout()
function is non-blocking and will return immediately. Therefore your loop will iterate very quickly and it will initiate 3-second timeout triggers one after the other in quick succession. That is why your first alerts pops up after 3 seconds, and all the rest follow in succession without any delay.
You may want to use something like this instead:
var i = 1; // set your counter to 1
function myLoop () { // create a loop function
setTimeout(function () { // call a 3s setTimeout when the loop is called
alert('hello'); // your code here
i++; // increment the counter
if (i < 10) { // if the counter < 10, call the loop function
myLoop(); // .. again which will trigger another
} // .. setTimeout()
}, 3000)
}
myLoop(); // start the loop
You could also neaten it up, by using a self invoking function, passing the number of iterations as an argument:
(function myLoop (i) {
setTimeout(function () {
alert('hello'); // your code here
if (--i) myLoop(i); // decrement i and call myLoop again if i > 0
}, 3000)
})(10); // pass the number of iterations as an argument
16
Wouldn't using recursion to implement this be subject to a stack overflow eventually? If you wanted to do a million iterations, what would be a better way to implement this? Maybe setInterval and then clear it, like Abel's solution below?
– Adam
Jun 24 '14 at 21:15
6
@Adam: my understanding is that, since setTimeout is non-blocking, this isn't recusion - the stackwindow closes after each setTimeout and there is only ever one setTimeout waiting to execute...Right?
– Joe
Sep 2 '15 at 17:10
3
How would this work when iterating an object like afor in
loop?
– vsync
Sep 14 '15 at 20:35
1
@vsync Look intoObject.keys()
– Braden Best
Aug 12 '16 at 18:41
1
@joey You are confusingsetTimeout
withsetInterval
. Timeouts are implicitly destroyed when the callback is called.
– cdhowie
Mar 1 '18 at 18:08
|
show 5 more comments
Try something like this:
var i = 0, howManyTimes = 10;
function f() {
alert( "hi" );
i++;
if( i < howManyTimes ){
setTimeout( f, 3000 );
}
}
f();
1
This is perfect. Super simple and worked like a charm. Nice work!
– Aarmora
Apr 7 '16 at 16:08
Flawless! Simple.
– Neo
Jul 2 '18 at 2:28
eventually, found my answer thanks :)
– Mesut GÜNEŞ
Feb 8 at 11:40
add a comment |
If using ES6, you could use let
to achieve this:
for (let i=1; i<10; i++) {
setTimeout( function timer(){
alert("hello world");
}, i*3000 );
}
What let
does is declare i
for each iteration, not the loop. This way, what is passed to setTimeout
is exactly what we want.
1
Thank! Wouldn't have thought of this method on my own. Actual block scoping. Imagine that...
– Sophia Gold
Jul 10 '16 at 1:46
1
I believe this has the same memory allocation issues as the answer described in stackoverflow.com/a/3583795/1337392
– Flame_Phoenix
Jul 21 '16 at 10:58
@Flame_Phoenix What memory allocation issues?
– 4castle
Jul 21 '17 at 0:29
The setTimeout call synchronously calculates the value of thei*3000
argument, inside the loop, and passes it tosetTimeout
by value. Usage oflet
is optional and unrelated to the questionl and answer.
– traktor53
Nov 21 '18 at 0:58
add a comment |
Another way is to multiply the time to timeout, but note that this is not like sleep. Code after the loop will be executed immediately, only the execution of the callback function is deferred.
for (var start = 1; start < 10; start++)
setTimeout(function () { alert('hello'); }, 3000 * start);
The first timeout will be set to 3000 * 1
, the second to 3000 * 2
and so on.
2
It's worth pointing out that you cannot reliably usestart
inside your function using this method.
– DBS
Jun 24 '15 at 13:17
2
Bad practice - unnecessary memory allocation.
– Alexander Trakhimenok
Oct 7 '15 at 15:37
Upvote for creativity, but it's damn bad practice. :)
– Salivan
Jun 27 '16 at 18:51
2
Why is it a bad practice, and why does it have memory allocation issues ? Does this answer suffer the same problems? stackoverflow.com/a/36018502/1337392
– Flame_Phoenix
Jul 21 '16 at 11:00
1
@Flame_Phoenix it's bad practice because the program will keep one timer for each loop, with all timers running at the same time. So if there are 1000 iterations, there will be 1000 timers running at the same time in the beginning.
– Joakim
Aug 9 '18 at 18:18
add a comment |
Since ES7 theres a better way to await a loop:
function timer(ms) {
return new Promise(res => setTimeout(res, ms));
}
async function load () {
for (var i = 0; i < 3; i++) {
console.log(i);
await timer(3000);
}
}
load();
Reference on MDN
Note that ES7 is rarely supported today, so you need to transpile with Babel to use it everywhere.
Transpiled
It works fine for me. I just want to ask that if I want to break loop , how can I do it when using await ?
– Sachin Shah
Aug 7 '18 at 11:25
@sachinbreak;
maybe?
– Jonas Wilms
Aug 7 '18 at 11:47
add a comment |
I think you need something like this:
var TimedQueue = function(defaultDelay){
this.queue = ;
this.index = 0;
this.defaultDelay = defaultDelay || 3000;
};
TimedQueue.prototype = {
add: function(fn, delay){
this.queue.push({
fn: fn,
delay: delay
});
},
run: function(index){
(index || index === 0) && (this.index = index);
this.next();
},
next: function(){
var self = this
, i = this.index++
, at = this.queue[i]
, next = this.queue[this.index]
if(!at) return;
at.fn();
next && setTimeout(function(){
self.next();
}, next.delay||this.defaultDelay);
},
reset: function(){
this.index = 0;
}
}
Test code:
var now = +new Date();
var x = new TimedQueue(2000);
x.add(function(){
console.log('hey');
console.log(+new Date() - now);
});
x.add(function(){
console.log('ho');
console.log(+new Date() - now);
}, 3000);
x.add(function(){
console.log('bye');
console.log(+new Date() - now);
});
x.run();
Note: using alerts stalls javascript execution till you close the alert.
It might be more code than you asked for, but this is a robust reusable solution.
add a comment |
I would probably use setInteval
. Like this,
var period = 1000; // ms
var endTime = 10000; // ms
var counter = 0;
var sleepyAlert = setInterval(function(){
alert('Hello');
if(counter === endTime){
clearInterval(sleepyAlert);
}
counter += period;
}, period);
3
SetTimeout is much better than settinterval. google it and you will know
– Abdul Jabbar Dumrai
Feb 23 '14 at 22:26
13
I google it around a little and I found nothing, Why setInterval is bad ? Can you give us a link ? or an example ? Thanks
– Marcs
Mar 20 '16 at 22:08
I guess the point was thatSetInterval()
keeps spawning 'threads' even in the event of some error or block.
– Mateen Ulhaq
Nov 21 '17 at 1:00
add a comment |
This will work
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
Try this fiddle: https://jsfiddle.net/wgdx8zqq/
1
This does trigger all timeout calls near the same time though
– Eddie
Apr 10 '18 at 19:19
the only thing I say, I have cracked this way, used$.Deferred
but it were some different scenario to let it worked, thumbs to you..!
– ArifMustafa
Oct 20 '18 at 6:55
add a comment |
In ES6 (ECMAScript 2015) you can iterate with delay with generator and interval.
Generators, a new feature of ECMAScript 6, are functions that can be
paused and resumed. Calling genFunc does not execute it. Instead, it
returns a so-called generator object that lets us control genFunc’s
execution. genFunc() is initially suspended at the beginning of its
body. The method genObj.next() continues the execution of genFunc,
until the next yield.
(Exploring ES6)
Code example:
let arr = [1, 2, 3, 'b'];
let genObj = genFunc();
let val = genObj.next();
console.log(val.value);
let interval = setInterval(() => {
val = genObj.next();
if (val.done) {
clearInterval(interval);
} else {
console.log(val.value);
}
}, 1000);
function* genFunc() {
for(let item of arr) {
yield item;
}
}
So if you are using ES6, that the most elegant way to achieve loop with delay (for my opinion).
add a comment |
I do this with Bluebird’s Promise.delay
and recursion.
function myLoop(i) {
return Promise.delay(1000)
.then(function() {
if (i > 0) {
alert('hello');
return myLoop(i -= 1);
}
});
}
myLoop(3);
<script src="//cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.4/bluebird.min.js"></script>
add a comment |
Just thought I'd post my two cents here as well. This function runs an iterative loop with a delay. See this jsfiddle. The function is as follows:
function timeout(range, time, callback){
var i = range[0];
callback(i);
Loop();
function Loop(){
setTimeout(function(){
i++;
if (i<range[1]){
callback(i);
Loop();
}
}, time*1000)
}
}
For example:
//This function prints the loop number every second
timeout([0, 5], 1, function(i){
console.log(i);
});
Would be equivalent to:
//This function prints the loop number instantly
for (var i = 0; i<5; i++){
console.log(i);
}
add a comment |
You can use RxJS interval operator. Interval emits integer every x number of seconds, and take is specify number of times it has to emit numberss
Rx.Observable
.interval(1000)
.take(10)
.subscribe((x) => console.log(x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.min.js"></script>
add a comment |
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 1000;
function functionToRun(i, length) {
alert(data[i]);
}
(function forWithDelay(i, length, fn, delay) {
setTimeout(function() {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
A modified version of Daniel Vassallo's answer, with variables extracted into parameters to make the function more reusable:
First let's define some essential variables:
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 3000;
Next you should define the function you want to run. This will get passed i, the current index of the loop and the length of the loop, in case you need it:
function functionToRun(i, length) {
alert(data[i]);
}
Self-executing version
(function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
Functional version
function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
}
forWithDelay(startIndex, data.length, functionToRun, timeout); // Lets run it
nice one and how do I pass data to the function without a global variable
– Sundara Prabu
May 29 '17 at 17:54
add a comment |
/*
Use Recursive and setTimeout
call below function will run loop loopFunctionNeedCheck until
conditionCheckAfterRunFn = true, if conditionCheckAfterRunFn == false : delay
reRunAfterMs miliseconds and continue loop
tested code, thanks
*/
function functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn,
loopFunctionNeedCheck) {
loopFunctionNeedCheck();
var result = conditionCheckAfterRunFn();
//check after run
if (!result) {
setTimeout(function () {
functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn, loopFunctionNeedCheck)
}, reRunAfterMs);
}
else console.log("completed, thanks");
//if you need call a function after completed add code call callback in here
}
//passing-parameters-to-a-callback-function
// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
Function.prototype.bind = function () {
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function () {
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
//test code:
var result = 0;
console.log("---> init result is " + result);
var functionNeedRun = function (step) {
result+=step;
console.log("current result is " + result);
}
var checkResultFunction = function () {
return result==100;
}
//call this function will run loop functionNeedRun and delay 500 miliseconds until result=100
functionRepeatUntilConditionTrue(500, checkResultFunction , functionNeedRun.bind(null, 5));
//result log from console:
/*
---> init result is 0
current result is 5
undefined
current result is 10
current result is 15
current result is 20
current result is 25
current result is 30
current result is 35
current result is 40
current result is 45
current result is 50
current result is 55
current result is 60
current result is 65
current result is 70
current result is 75
current result is 80
current result is 85
current result is 90
current result is 95
current result is 100
completed, thanks
*/
7
Your function names are horrendous, that's the main reason why this code is so hard to read.
– Mark Walters
Nov 26 '13 at 15:11
add a comment |
Here is how I created an infinite loop with a delay that breaks on a certain condition:
// Now continuously check the app status until it's completed,
// failed or times out. The isFinished() will throw exception if
// there is a failure.
while (true) {
let status = await this.api.getStatus(appId);
if (isFinished(status)) {
break;
} else {
// Delay before running the next loop iteration:
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
The key here is to create a new Promise that resolves by timeout, and to await for its resolution.
Obviously you need async/await support for that. Works in Node 8.
add a comment |
for common use "forget normal loops" and use this combination of "setInterval" includes "setTimeOut"s: like this (from my real tasks).
function iAsk(lvl){
var i=0;
var intr =setInterval(function(){ // start the loop
i++; // increment it
if(i>lvl){ // check if the end round reached.
clearInterval(intr);
return;
}
setTimeout(function(){
$(".imag").prop("src",pPng); // do first bla bla bla after 50 millisecond
},50);
setTimeout(function(){
// do another bla bla bla after 100 millisecond.
seq[i-1]=(Math.ceil(Math.random()*4)).toString();
$("#hh").after('<br>'+i + ' : rand= '+(Math.ceil(Math.random()*4)).toString()+' > '+seq[i-1]);
$("#d"+seq[i-1]).prop("src",pGif);
var d =document.getElementById('aud');
d.play();
},100);
setTimeout(function(){
// keep adding bla bla bla till you done :)
$("#d"+seq[i-1]).prop("src",pPng);
},900);
},1000); // loop waiting time must be >= 900 (biggest timeOut for inside actions)
}
PS: Understand that the real behavior of (setTimeOut): they all will start in same time "the three bla bla bla will start counting down in the same moment" so make a different timeout to arrange the execution.
PS 2: the example for timing loop, but for a reaction loops you can use events, promise async await ..
add a comment |
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
for(var i=0; i<5; i++) {
var sno = i+1;
(function myLoop (i) {
setTimeout(function () {
alert(i); // Do your function here
}, 1000*i);
})(sno);
}
}
</script>
</body>
</html>
1
Please always provide at least brief description to your code snippets, at least for others to be sure that you address the question.
– Hexfire
Jan 23 '18 at 7:47
1
Code only answers arent encouraged as they dont provide much information for future readers please provide some explanation to what you have written
– WhatsThePoint
Jan 23 '18 at 7:58
add a comment |
Simple implementation of showing a piece of text every two seconds as long the loop is running.
for (var i = 0; i < foo.length; i++) {
setInterval(function(){
console.log("I will appear every 2 seconds");
}, 2000);
break;
};
add a comment |
To my knowledge the setTimeout
function is called asynchronously. What you can do is wrap the entire loop within an async function and await a Promise
that contains the setTimeout as shown:
var looper = async function () {
for (var start = 1; start < 10; start++) {
await new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("iteration: " + start.toString());
resolve(true);
}, 1000);
});
}
return true;
}
And then you call run it like so:
looper().then(function(){
console.log("DONE!")
});
Please take some time to get a good understanding of asynchronous programming.
add a comment |
Here is a function that I use for looping over an array:
function loopOnArrayWithDelay(theArray, delayAmount, i, theFunction, onComplete){
if (i < theArray.length && typeof delayAmount == 'number'){
console.log("i "+i);
theFunction(theArray[i], i);
setTimeout(function(){
loopOnArrayWithDelay(theArray, delayAmount, (i+1), theFunction, onComplete)}, delayAmount);
}else{
onComplete(i);
}
}
You use it like this:
loopOnArrayWithDelay(YourArray, 1000, 0, function(e, i){
//Do something with item
}, function(i){
//Do something once loop has completed
}
add a comment |
This script works for most things
function timer(start) {
setTimeout(function () { //The timer
alert('hello');
}, start*3000); //needs the "start*" or else all the timers will run at 3000ms
}
for(var start = 1; start < 10; start++) {
timer(start);
}
add a comment |
var timer, i = 10;
function myLoop () { // create a loop function
timer = setTimeout(function () {
document.getElementById("demo").innerHTML = i;
i--;
if (i >= 0) {
myLoop();
} else {
clearTimeout(timer); // clear timeout
document.getElementById("demo").innerHTML = "DOARRRR ..";
}
}, 1000);
}
myLoop();
<p id="demo">count</p>
add a comment |
Try this...
var icount=0;
for (let i in items) {
icount=icount+1000;
new beginCount(items[i],icount);
}
function beginCount(item,icount){
setTimeout(function () {
new actualFunction(item,icount);
}, icount);
}
function actualFunction(item,icount){
//...runs ever 1 second
console.log(icount);
}
add a comment |
Try this
//the code will execute in 1 3 5 7 9 seconds later
function exec(){
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(new Date()); //It's you code
},(i+i+1)*1000);
}
}
add a comment |
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',
autoActivateHeartbeat: false,
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f3583724%2fhow-do-i-add-a-delay-in-a-javascript-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
24 Answers
24
active
oldest
votes
24 Answers
24
active
oldest
votes
active
oldest
votes
active
oldest
votes
The setTimeout()
function is non-blocking and will return immediately. Therefore your loop will iterate very quickly and it will initiate 3-second timeout triggers one after the other in quick succession. That is why your first alerts pops up after 3 seconds, and all the rest follow in succession without any delay.
You may want to use something like this instead:
var i = 1; // set your counter to 1
function myLoop () { // create a loop function
setTimeout(function () { // call a 3s setTimeout when the loop is called
alert('hello'); // your code here
i++; // increment the counter
if (i < 10) { // if the counter < 10, call the loop function
myLoop(); // .. again which will trigger another
} // .. setTimeout()
}, 3000)
}
myLoop(); // start the loop
You could also neaten it up, by using a self invoking function, passing the number of iterations as an argument:
(function myLoop (i) {
setTimeout(function () {
alert('hello'); // your code here
if (--i) myLoop(i); // decrement i and call myLoop again if i > 0
}, 3000)
})(10); // pass the number of iterations as an argument
16
Wouldn't using recursion to implement this be subject to a stack overflow eventually? If you wanted to do a million iterations, what would be a better way to implement this? Maybe setInterval and then clear it, like Abel's solution below?
– Adam
Jun 24 '14 at 21:15
6
@Adam: my understanding is that, since setTimeout is non-blocking, this isn't recusion - the stackwindow closes after each setTimeout and there is only ever one setTimeout waiting to execute...Right?
– Joe
Sep 2 '15 at 17:10
3
How would this work when iterating an object like afor in
loop?
– vsync
Sep 14 '15 at 20:35
1
@vsync Look intoObject.keys()
– Braden Best
Aug 12 '16 at 18:41
1
@joey You are confusingsetTimeout
withsetInterval
. Timeouts are implicitly destroyed when the callback is called.
– cdhowie
Mar 1 '18 at 18:08
|
show 5 more comments
The setTimeout()
function is non-blocking and will return immediately. Therefore your loop will iterate very quickly and it will initiate 3-second timeout triggers one after the other in quick succession. That is why your first alerts pops up after 3 seconds, and all the rest follow in succession without any delay.
You may want to use something like this instead:
var i = 1; // set your counter to 1
function myLoop () { // create a loop function
setTimeout(function () { // call a 3s setTimeout when the loop is called
alert('hello'); // your code here
i++; // increment the counter
if (i < 10) { // if the counter < 10, call the loop function
myLoop(); // .. again which will trigger another
} // .. setTimeout()
}, 3000)
}
myLoop(); // start the loop
You could also neaten it up, by using a self invoking function, passing the number of iterations as an argument:
(function myLoop (i) {
setTimeout(function () {
alert('hello'); // your code here
if (--i) myLoop(i); // decrement i and call myLoop again if i > 0
}, 3000)
})(10); // pass the number of iterations as an argument
16
Wouldn't using recursion to implement this be subject to a stack overflow eventually? If you wanted to do a million iterations, what would be a better way to implement this? Maybe setInterval and then clear it, like Abel's solution below?
– Adam
Jun 24 '14 at 21:15
6
@Adam: my understanding is that, since setTimeout is non-blocking, this isn't recusion - the stackwindow closes after each setTimeout and there is only ever one setTimeout waiting to execute...Right?
– Joe
Sep 2 '15 at 17:10
3
How would this work when iterating an object like afor in
loop?
– vsync
Sep 14 '15 at 20:35
1
@vsync Look intoObject.keys()
– Braden Best
Aug 12 '16 at 18:41
1
@joey You are confusingsetTimeout
withsetInterval
. Timeouts are implicitly destroyed when the callback is called.
– cdhowie
Mar 1 '18 at 18:08
|
show 5 more comments
The setTimeout()
function is non-blocking and will return immediately. Therefore your loop will iterate very quickly and it will initiate 3-second timeout triggers one after the other in quick succession. That is why your first alerts pops up after 3 seconds, and all the rest follow in succession without any delay.
You may want to use something like this instead:
var i = 1; // set your counter to 1
function myLoop () { // create a loop function
setTimeout(function () { // call a 3s setTimeout when the loop is called
alert('hello'); // your code here
i++; // increment the counter
if (i < 10) { // if the counter < 10, call the loop function
myLoop(); // .. again which will trigger another
} // .. setTimeout()
}, 3000)
}
myLoop(); // start the loop
You could also neaten it up, by using a self invoking function, passing the number of iterations as an argument:
(function myLoop (i) {
setTimeout(function () {
alert('hello'); // your code here
if (--i) myLoop(i); // decrement i and call myLoop again if i > 0
}, 3000)
})(10); // pass the number of iterations as an argument
The setTimeout()
function is non-blocking and will return immediately. Therefore your loop will iterate very quickly and it will initiate 3-second timeout triggers one after the other in quick succession. That is why your first alerts pops up after 3 seconds, and all the rest follow in succession without any delay.
You may want to use something like this instead:
var i = 1; // set your counter to 1
function myLoop () { // create a loop function
setTimeout(function () { // call a 3s setTimeout when the loop is called
alert('hello'); // your code here
i++; // increment the counter
if (i < 10) { // if the counter < 10, call the loop function
myLoop(); // .. again which will trigger another
} // .. setTimeout()
}, 3000)
}
myLoop(); // start the loop
You could also neaten it up, by using a self invoking function, passing the number of iterations as an argument:
(function myLoop (i) {
setTimeout(function () {
alert('hello'); // your code here
if (--i) myLoop(i); // decrement i and call myLoop again if i > 0
}, 3000)
})(10); // pass the number of iterations as an argument
edited Aug 27 '10 at 12:07
answered Aug 27 '10 at 11:38
Daniel VassalloDaniel Vassallo
273k60450407
273k60450407
16
Wouldn't using recursion to implement this be subject to a stack overflow eventually? If you wanted to do a million iterations, what would be a better way to implement this? Maybe setInterval and then clear it, like Abel's solution below?
– Adam
Jun 24 '14 at 21:15
6
@Adam: my understanding is that, since setTimeout is non-blocking, this isn't recusion - the stackwindow closes after each setTimeout and there is only ever one setTimeout waiting to execute...Right?
– Joe
Sep 2 '15 at 17:10
3
How would this work when iterating an object like afor in
loop?
– vsync
Sep 14 '15 at 20:35
1
@vsync Look intoObject.keys()
– Braden Best
Aug 12 '16 at 18:41
1
@joey You are confusingsetTimeout
withsetInterval
. Timeouts are implicitly destroyed when the callback is called.
– cdhowie
Mar 1 '18 at 18:08
|
show 5 more comments
16
Wouldn't using recursion to implement this be subject to a stack overflow eventually? If you wanted to do a million iterations, what would be a better way to implement this? Maybe setInterval and then clear it, like Abel's solution below?
– Adam
Jun 24 '14 at 21:15
6
@Adam: my understanding is that, since setTimeout is non-blocking, this isn't recusion - the stackwindow closes after each setTimeout and there is only ever one setTimeout waiting to execute...Right?
– Joe
Sep 2 '15 at 17:10
3
How would this work when iterating an object like afor in
loop?
– vsync
Sep 14 '15 at 20:35
1
@vsync Look intoObject.keys()
– Braden Best
Aug 12 '16 at 18:41
1
@joey You are confusingsetTimeout
withsetInterval
. Timeouts are implicitly destroyed when the callback is called.
– cdhowie
Mar 1 '18 at 18:08
16
16
Wouldn't using recursion to implement this be subject to a stack overflow eventually? If you wanted to do a million iterations, what would be a better way to implement this? Maybe setInterval and then clear it, like Abel's solution below?
– Adam
Jun 24 '14 at 21:15
Wouldn't using recursion to implement this be subject to a stack overflow eventually? If you wanted to do a million iterations, what would be a better way to implement this? Maybe setInterval and then clear it, like Abel's solution below?
– Adam
Jun 24 '14 at 21:15
6
6
@Adam: my understanding is that, since setTimeout is non-blocking, this isn't recusion - the stackwindow closes after each setTimeout and there is only ever one setTimeout waiting to execute...Right?
– Joe
Sep 2 '15 at 17:10
@Adam: my understanding is that, since setTimeout is non-blocking, this isn't recusion - the stackwindow closes after each setTimeout and there is only ever one setTimeout waiting to execute...Right?
– Joe
Sep 2 '15 at 17:10
3
3
How would this work when iterating an object like a
for in
loop?– vsync
Sep 14 '15 at 20:35
How would this work when iterating an object like a
for in
loop?– vsync
Sep 14 '15 at 20:35
1
1
@vsync Look into
Object.keys()
– Braden Best
Aug 12 '16 at 18:41
@vsync Look into
Object.keys()
– Braden Best
Aug 12 '16 at 18:41
1
1
@joey You are confusing
setTimeout
with setInterval
. Timeouts are implicitly destroyed when the callback is called.– cdhowie
Mar 1 '18 at 18:08
@joey You are confusing
setTimeout
with setInterval
. Timeouts are implicitly destroyed when the callback is called.– cdhowie
Mar 1 '18 at 18:08
|
show 5 more comments
Try something like this:
var i = 0, howManyTimes = 10;
function f() {
alert( "hi" );
i++;
if( i < howManyTimes ){
setTimeout( f, 3000 );
}
}
f();
1
This is perfect. Super simple and worked like a charm. Nice work!
– Aarmora
Apr 7 '16 at 16:08
Flawless! Simple.
– Neo
Jul 2 '18 at 2:28
eventually, found my answer thanks :)
– Mesut GÜNEŞ
Feb 8 at 11:40
add a comment |
Try something like this:
var i = 0, howManyTimes = 10;
function f() {
alert( "hi" );
i++;
if( i < howManyTimes ){
setTimeout( f, 3000 );
}
}
f();
1
This is perfect. Super simple and worked like a charm. Nice work!
– Aarmora
Apr 7 '16 at 16:08
Flawless! Simple.
– Neo
Jul 2 '18 at 2:28
eventually, found my answer thanks :)
– Mesut GÜNEŞ
Feb 8 at 11:40
add a comment |
Try something like this:
var i = 0, howManyTimes = 10;
function f() {
alert( "hi" );
i++;
if( i < howManyTimes ){
setTimeout( f, 3000 );
}
}
f();
Try something like this:
var i = 0, howManyTimes = 10;
function f() {
alert( "hi" );
i++;
if( i < howManyTimes ){
setTimeout( f, 3000 );
}
}
f();
answered Aug 27 '10 at 11:40
cjicji
5,43021615
5,43021615
1
This is perfect. Super simple and worked like a charm. Nice work!
– Aarmora
Apr 7 '16 at 16:08
Flawless! Simple.
– Neo
Jul 2 '18 at 2:28
eventually, found my answer thanks :)
– Mesut GÜNEŞ
Feb 8 at 11:40
add a comment |
1
This is perfect. Super simple and worked like a charm. Nice work!
– Aarmora
Apr 7 '16 at 16:08
Flawless! Simple.
– Neo
Jul 2 '18 at 2:28
eventually, found my answer thanks :)
– Mesut GÜNEŞ
Feb 8 at 11:40
1
1
This is perfect. Super simple and worked like a charm. Nice work!
– Aarmora
Apr 7 '16 at 16:08
This is perfect. Super simple and worked like a charm. Nice work!
– Aarmora
Apr 7 '16 at 16:08
Flawless! Simple.
– Neo
Jul 2 '18 at 2:28
Flawless! Simple.
– Neo
Jul 2 '18 at 2:28
eventually, found my answer thanks :)
– Mesut GÜNEŞ
Feb 8 at 11:40
eventually, found my answer thanks :)
– Mesut GÜNEŞ
Feb 8 at 11:40
add a comment |
If using ES6, you could use let
to achieve this:
for (let i=1; i<10; i++) {
setTimeout( function timer(){
alert("hello world");
}, i*3000 );
}
What let
does is declare i
for each iteration, not the loop. This way, what is passed to setTimeout
is exactly what we want.
1
Thank! Wouldn't have thought of this method on my own. Actual block scoping. Imagine that...
– Sophia Gold
Jul 10 '16 at 1:46
1
I believe this has the same memory allocation issues as the answer described in stackoverflow.com/a/3583795/1337392
– Flame_Phoenix
Jul 21 '16 at 10:58
@Flame_Phoenix What memory allocation issues?
– 4castle
Jul 21 '17 at 0:29
The setTimeout call synchronously calculates the value of thei*3000
argument, inside the loop, and passes it tosetTimeout
by value. Usage oflet
is optional and unrelated to the questionl and answer.
– traktor53
Nov 21 '18 at 0:58
add a comment |
If using ES6, you could use let
to achieve this:
for (let i=1; i<10; i++) {
setTimeout( function timer(){
alert("hello world");
}, i*3000 );
}
What let
does is declare i
for each iteration, not the loop. This way, what is passed to setTimeout
is exactly what we want.
1
Thank! Wouldn't have thought of this method on my own. Actual block scoping. Imagine that...
– Sophia Gold
Jul 10 '16 at 1:46
1
I believe this has the same memory allocation issues as the answer described in stackoverflow.com/a/3583795/1337392
– Flame_Phoenix
Jul 21 '16 at 10:58
@Flame_Phoenix What memory allocation issues?
– 4castle
Jul 21 '17 at 0:29
The setTimeout call synchronously calculates the value of thei*3000
argument, inside the loop, and passes it tosetTimeout
by value. Usage oflet
is optional and unrelated to the questionl and answer.
– traktor53
Nov 21 '18 at 0:58
add a comment |
If using ES6, you could use let
to achieve this:
for (let i=1; i<10; i++) {
setTimeout( function timer(){
alert("hello world");
}, i*3000 );
}
What let
does is declare i
for each iteration, not the loop. This way, what is passed to setTimeout
is exactly what we want.
If using ES6, you could use let
to achieve this:
for (let i=1; i<10; i++) {
setTimeout( function timer(){
alert("hello world");
}, i*3000 );
}
What let
does is declare i
for each iteration, not the loop. This way, what is passed to setTimeout
is exactly what we want.
answered Mar 15 '16 at 17:47
Saket MehtaSaket Mehta
1,19511625
1,19511625
1
Thank! Wouldn't have thought of this method on my own. Actual block scoping. Imagine that...
– Sophia Gold
Jul 10 '16 at 1:46
1
I believe this has the same memory allocation issues as the answer described in stackoverflow.com/a/3583795/1337392
– Flame_Phoenix
Jul 21 '16 at 10:58
@Flame_Phoenix What memory allocation issues?
– 4castle
Jul 21 '17 at 0:29
The setTimeout call synchronously calculates the value of thei*3000
argument, inside the loop, and passes it tosetTimeout
by value. Usage oflet
is optional and unrelated to the questionl and answer.
– traktor53
Nov 21 '18 at 0:58
add a comment |
1
Thank! Wouldn't have thought of this method on my own. Actual block scoping. Imagine that...
– Sophia Gold
Jul 10 '16 at 1:46
1
I believe this has the same memory allocation issues as the answer described in stackoverflow.com/a/3583795/1337392
– Flame_Phoenix
Jul 21 '16 at 10:58
@Flame_Phoenix What memory allocation issues?
– 4castle
Jul 21 '17 at 0:29
The setTimeout call synchronously calculates the value of thei*3000
argument, inside the loop, and passes it tosetTimeout
by value. Usage oflet
is optional and unrelated to the questionl and answer.
– traktor53
Nov 21 '18 at 0:58
1
1
Thank! Wouldn't have thought of this method on my own. Actual block scoping. Imagine that...
– Sophia Gold
Jul 10 '16 at 1:46
Thank! Wouldn't have thought of this method on my own. Actual block scoping. Imagine that...
– Sophia Gold
Jul 10 '16 at 1:46
1
1
I believe this has the same memory allocation issues as the answer described in stackoverflow.com/a/3583795/1337392
– Flame_Phoenix
Jul 21 '16 at 10:58
I believe this has the same memory allocation issues as the answer described in stackoverflow.com/a/3583795/1337392
– Flame_Phoenix
Jul 21 '16 at 10:58
@Flame_Phoenix What memory allocation issues?
– 4castle
Jul 21 '17 at 0:29
@Flame_Phoenix What memory allocation issues?
– 4castle
Jul 21 '17 at 0:29
The setTimeout call synchronously calculates the value of the
i*3000
argument, inside the loop, and passes it to setTimeout
by value. Usage of let
is optional and unrelated to the questionl and answer.– traktor53
Nov 21 '18 at 0:58
The setTimeout call synchronously calculates the value of the
i*3000
argument, inside the loop, and passes it to setTimeout
by value. Usage of let
is optional and unrelated to the questionl and answer.– traktor53
Nov 21 '18 at 0:58
add a comment |
Another way is to multiply the time to timeout, but note that this is not like sleep. Code after the loop will be executed immediately, only the execution of the callback function is deferred.
for (var start = 1; start < 10; start++)
setTimeout(function () { alert('hello'); }, 3000 * start);
The first timeout will be set to 3000 * 1
, the second to 3000 * 2
and so on.
2
It's worth pointing out that you cannot reliably usestart
inside your function using this method.
– DBS
Jun 24 '15 at 13:17
2
Bad practice - unnecessary memory allocation.
– Alexander Trakhimenok
Oct 7 '15 at 15:37
Upvote for creativity, but it's damn bad practice. :)
– Salivan
Jun 27 '16 at 18:51
2
Why is it a bad practice, and why does it have memory allocation issues ? Does this answer suffer the same problems? stackoverflow.com/a/36018502/1337392
– Flame_Phoenix
Jul 21 '16 at 11:00
1
@Flame_Phoenix it's bad practice because the program will keep one timer for each loop, with all timers running at the same time. So if there are 1000 iterations, there will be 1000 timers running at the same time in the beginning.
– Joakim
Aug 9 '18 at 18:18
add a comment |
Another way is to multiply the time to timeout, but note that this is not like sleep. Code after the loop will be executed immediately, only the execution of the callback function is deferred.
for (var start = 1; start < 10; start++)
setTimeout(function () { alert('hello'); }, 3000 * start);
The first timeout will be set to 3000 * 1
, the second to 3000 * 2
and so on.
2
It's worth pointing out that you cannot reliably usestart
inside your function using this method.
– DBS
Jun 24 '15 at 13:17
2
Bad practice - unnecessary memory allocation.
– Alexander Trakhimenok
Oct 7 '15 at 15:37
Upvote for creativity, but it's damn bad practice. :)
– Salivan
Jun 27 '16 at 18:51
2
Why is it a bad practice, and why does it have memory allocation issues ? Does this answer suffer the same problems? stackoverflow.com/a/36018502/1337392
– Flame_Phoenix
Jul 21 '16 at 11:00
1
@Flame_Phoenix it's bad practice because the program will keep one timer for each loop, with all timers running at the same time. So if there are 1000 iterations, there will be 1000 timers running at the same time in the beginning.
– Joakim
Aug 9 '18 at 18:18
add a comment |
Another way is to multiply the time to timeout, but note that this is not like sleep. Code after the loop will be executed immediately, only the execution of the callback function is deferred.
for (var start = 1; start < 10; start++)
setTimeout(function () { alert('hello'); }, 3000 * start);
The first timeout will be set to 3000 * 1
, the second to 3000 * 2
and so on.
Another way is to multiply the time to timeout, but note that this is not like sleep. Code after the loop will be executed immediately, only the execution of the callback function is deferred.
for (var start = 1; start < 10; start++)
setTimeout(function () { alert('hello'); }, 3000 * start);
The first timeout will be set to 3000 * 1
, the second to 3000 * 2
and so on.
answered Aug 27 '10 at 11:48
Felix KlingFelix Kling
561k130870932
561k130870932
2
It's worth pointing out that you cannot reliably usestart
inside your function using this method.
– DBS
Jun 24 '15 at 13:17
2
Bad practice - unnecessary memory allocation.
– Alexander Trakhimenok
Oct 7 '15 at 15:37
Upvote for creativity, but it's damn bad practice. :)
– Salivan
Jun 27 '16 at 18:51
2
Why is it a bad practice, and why does it have memory allocation issues ? Does this answer suffer the same problems? stackoverflow.com/a/36018502/1337392
– Flame_Phoenix
Jul 21 '16 at 11:00
1
@Flame_Phoenix it's bad practice because the program will keep one timer for each loop, with all timers running at the same time. So if there are 1000 iterations, there will be 1000 timers running at the same time in the beginning.
– Joakim
Aug 9 '18 at 18:18
add a comment |
2
It's worth pointing out that you cannot reliably usestart
inside your function using this method.
– DBS
Jun 24 '15 at 13:17
2
Bad practice - unnecessary memory allocation.
– Alexander Trakhimenok
Oct 7 '15 at 15:37
Upvote for creativity, but it's damn bad practice. :)
– Salivan
Jun 27 '16 at 18:51
2
Why is it a bad practice, and why does it have memory allocation issues ? Does this answer suffer the same problems? stackoverflow.com/a/36018502/1337392
– Flame_Phoenix
Jul 21 '16 at 11:00
1
@Flame_Phoenix it's bad practice because the program will keep one timer for each loop, with all timers running at the same time. So if there are 1000 iterations, there will be 1000 timers running at the same time in the beginning.
– Joakim
Aug 9 '18 at 18:18
2
2
It's worth pointing out that you cannot reliably use
start
inside your function using this method.– DBS
Jun 24 '15 at 13:17
It's worth pointing out that you cannot reliably use
start
inside your function using this method.– DBS
Jun 24 '15 at 13:17
2
2
Bad practice - unnecessary memory allocation.
– Alexander Trakhimenok
Oct 7 '15 at 15:37
Bad practice - unnecessary memory allocation.
– Alexander Trakhimenok
Oct 7 '15 at 15:37
Upvote for creativity, but it's damn bad practice. :)
– Salivan
Jun 27 '16 at 18:51
Upvote for creativity, but it's damn bad practice. :)
– Salivan
Jun 27 '16 at 18:51
2
2
Why is it a bad practice, and why does it have memory allocation issues ? Does this answer suffer the same problems? stackoverflow.com/a/36018502/1337392
– Flame_Phoenix
Jul 21 '16 at 11:00
Why is it a bad practice, and why does it have memory allocation issues ? Does this answer suffer the same problems? stackoverflow.com/a/36018502/1337392
– Flame_Phoenix
Jul 21 '16 at 11:00
1
1
@Flame_Phoenix it's bad practice because the program will keep one timer for each loop, with all timers running at the same time. So if there are 1000 iterations, there will be 1000 timers running at the same time in the beginning.
– Joakim
Aug 9 '18 at 18:18
@Flame_Phoenix it's bad practice because the program will keep one timer for each loop, with all timers running at the same time. So if there are 1000 iterations, there will be 1000 timers running at the same time in the beginning.
– Joakim
Aug 9 '18 at 18:18
add a comment |
Since ES7 theres a better way to await a loop:
function timer(ms) {
return new Promise(res => setTimeout(res, ms));
}
async function load () {
for (var i = 0; i < 3; i++) {
console.log(i);
await timer(3000);
}
}
load();
Reference on MDN
Note that ES7 is rarely supported today, so you need to transpile with Babel to use it everywhere.
Transpiled
It works fine for me. I just want to ask that if I want to break loop , how can I do it when using await ?
– Sachin Shah
Aug 7 '18 at 11:25
@sachinbreak;
maybe?
– Jonas Wilms
Aug 7 '18 at 11:47
add a comment |
Since ES7 theres a better way to await a loop:
function timer(ms) {
return new Promise(res => setTimeout(res, ms));
}
async function load () {
for (var i = 0; i < 3; i++) {
console.log(i);
await timer(3000);
}
}
load();
Reference on MDN
Note that ES7 is rarely supported today, so you need to transpile with Babel to use it everywhere.
Transpiled
It works fine for me. I just want to ask that if I want to break loop , how can I do it when using await ?
– Sachin Shah
Aug 7 '18 at 11:25
@sachinbreak;
maybe?
– Jonas Wilms
Aug 7 '18 at 11:47
add a comment |
Since ES7 theres a better way to await a loop:
function timer(ms) {
return new Promise(res => setTimeout(res, ms));
}
async function load () {
for (var i = 0; i < 3; i++) {
console.log(i);
await timer(3000);
}
}
load();
Reference on MDN
Note that ES7 is rarely supported today, so you need to transpile with Babel to use it everywhere.
Transpiled
Since ES7 theres a better way to await a loop:
function timer(ms) {
return new Promise(res => setTimeout(res, ms));
}
async function load () {
for (var i = 0; i < 3; i++) {
console.log(i);
await timer(3000);
}
}
load();
Reference on MDN
Note that ES7 is rarely supported today, so you need to transpile with Babel to use it everywhere.
Transpiled
edited Dec 19 '18 at 15:31
answered Jun 10 '17 at 18:19
Jonas WilmsJonas Wilms
63.3k53457
63.3k53457
It works fine for me. I just want to ask that if I want to break loop , how can I do it when using await ?
– Sachin Shah
Aug 7 '18 at 11:25
@sachinbreak;
maybe?
– Jonas Wilms
Aug 7 '18 at 11:47
add a comment |
It works fine for me. I just want to ask that if I want to break loop , how can I do it when using await ?
– Sachin Shah
Aug 7 '18 at 11:25
@sachinbreak;
maybe?
– Jonas Wilms
Aug 7 '18 at 11:47
It works fine for me. I just want to ask that if I want to break loop , how can I do it when using await ?
– Sachin Shah
Aug 7 '18 at 11:25
It works fine for me. I just want to ask that if I want to break loop , how can I do it when using await ?
– Sachin Shah
Aug 7 '18 at 11:25
@sachin
break;
maybe?– Jonas Wilms
Aug 7 '18 at 11:47
@sachin
break;
maybe?– Jonas Wilms
Aug 7 '18 at 11:47
add a comment |
I think you need something like this:
var TimedQueue = function(defaultDelay){
this.queue = ;
this.index = 0;
this.defaultDelay = defaultDelay || 3000;
};
TimedQueue.prototype = {
add: function(fn, delay){
this.queue.push({
fn: fn,
delay: delay
});
},
run: function(index){
(index || index === 0) && (this.index = index);
this.next();
},
next: function(){
var self = this
, i = this.index++
, at = this.queue[i]
, next = this.queue[this.index]
if(!at) return;
at.fn();
next && setTimeout(function(){
self.next();
}, next.delay||this.defaultDelay);
},
reset: function(){
this.index = 0;
}
}
Test code:
var now = +new Date();
var x = new TimedQueue(2000);
x.add(function(){
console.log('hey');
console.log(+new Date() - now);
});
x.add(function(){
console.log('ho');
console.log(+new Date() - now);
}, 3000);
x.add(function(){
console.log('bye');
console.log(+new Date() - now);
});
x.run();
Note: using alerts stalls javascript execution till you close the alert.
It might be more code than you asked for, but this is a robust reusable solution.
add a comment |
I think you need something like this:
var TimedQueue = function(defaultDelay){
this.queue = ;
this.index = 0;
this.defaultDelay = defaultDelay || 3000;
};
TimedQueue.prototype = {
add: function(fn, delay){
this.queue.push({
fn: fn,
delay: delay
});
},
run: function(index){
(index || index === 0) && (this.index = index);
this.next();
},
next: function(){
var self = this
, i = this.index++
, at = this.queue[i]
, next = this.queue[this.index]
if(!at) return;
at.fn();
next && setTimeout(function(){
self.next();
}, next.delay||this.defaultDelay);
},
reset: function(){
this.index = 0;
}
}
Test code:
var now = +new Date();
var x = new TimedQueue(2000);
x.add(function(){
console.log('hey');
console.log(+new Date() - now);
});
x.add(function(){
console.log('ho');
console.log(+new Date() - now);
}, 3000);
x.add(function(){
console.log('bye');
console.log(+new Date() - now);
});
x.run();
Note: using alerts stalls javascript execution till you close the alert.
It might be more code than you asked for, but this is a robust reusable solution.
add a comment |
I think you need something like this:
var TimedQueue = function(defaultDelay){
this.queue = ;
this.index = 0;
this.defaultDelay = defaultDelay || 3000;
};
TimedQueue.prototype = {
add: function(fn, delay){
this.queue.push({
fn: fn,
delay: delay
});
},
run: function(index){
(index || index === 0) && (this.index = index);
this.next();
},
next: function(){
var self = this
, i = this.index++
, at = this.queue[i]
, next = this.queue[this.index]
if(!at) return;
at.fn();
next && setTimeout(function(){
self.next();
}, next.delay||this.defaultDelay);
},
reset: function(){
this.index = 0;
}
}
Test code:
var now = +new Date();
var x = new TimedQueue(2000);
x.add(function(){
console.log('hey');
console.log(+new Date() - now);
});
x.add(function(){
console.log('ho');
console.log(+new Date() - now);
}, 3000);
x.add(function(){
console.log('bye');
console.log(+new Date() - now);
});
x.run();
Note: using alerts stalls javascript execution till you close the alert.
It might be more code than you asked for, but this is a robust reusable solution.
I think you need something like this:
var TimedQueue = function(defaultDelay){
this.queue = ;
this.index = 0;
this.defaultDelay = defaultDelay || 3000;
};
TimedQueue.prototype = {
add: function(fn, delay){
this.queue.push({
fn: fn,
delay: delay
});
},
run: function(index){
(index || index === 0) && (this.index = index);
this.next();
},
next: function(){
var self = this
, i = this.index++
, at = this.queue[i]
, next = this.queue[this.index]
if(!at) return;
at.fn();
next && setTimeout(function(){
self.next();
}, next.delay||this.defaultDelay);
},
reset: function(){
this.index = 0;
}
}
Test code:
var now = +new Date();
var x = new TimedQueue(2000);
x.add(function(){
console.log('hey');
console.log(+new Date() - now);
});
x.add(function(){
console.log('ho');
console.log(+new Date() - now);
}, 3000);
x.add(function(){
console.log('bye');
console.log(+new Date() - now);
});
x.run();
Note: using alerts stalls javascript execution till you close the alert.
It might be more code than you asked for, but this is a robust reusable solution.
answered Aug 27 '10 at 12:20
BGerrissenBGerrissen
16.8k33338
16.8k33338
add a comment |
add a comment |
I would probably use setInteval
. Like this,
var period = 1000; // ms
var endTime = 10000; // ms
var counter = 0;
var sleepyAlert = setInterval(function(){
alert('Hello');
if(counter === endTime){
clearInterval(sleepyAlert);
}
counter += period;
}, period);
3
SetTimeout is much better than settinterval. google it and you will know
– Abdul Jabbar Dumrai
Feb 23 '14 at 22:26
13
I google it around a little and I found nothing, Why setInterval is bad ? Can you give us a link ? or an example ? Thanks
– Marcs
Mar 20 '16 at 22:08
I guess the point was thatSetInterval()
keeps spawning 'threads' even in the event of some error or block.
– Mateen Ulhaq
Nov 21 '17 at 1:00
add a comment |
I would probably use setInteval
. Like this,
var period = 1000; // ms
var endTime = 10000; // ms
var counter = 0;
var sleepyAlert = setInterval(function(){
alert('Hello');
if(counter === endTime){
clearInterval(sleepyAlert);
}
counter += period;
}, period);
3
SetTimeout is much better than settinterval. google it and you will know
– Abdul Jabbar Dumrai
Feb 23 '14 at 22:26
13
I google it around a little and I found nothing, Why setInterval is bad ? Can you give us a link ? or an example ? Thanks
– Marcs
Mar 20 '16 at 22:08
I guess the point was thatSetInterval()
keeps spawning 'threads' even in the event of some error or block.
– Mateen Ulhaq
Nov 21 '17 at 1:00
add a comment |
I would probably use setInteval
. Like this,
var period = 1000; // ms
var endTime = 10000; // ms
var counter = 0;
var sleepyAlert = setInterval(function(){
alert('Hello');
if(counter === endTime){
clearInterval(sleepyAlert);
}
counter += period;
}, period);
I would probably use setInteval
. Like this,
var period = 1000; // ms
var endTime = 10000; // ms
var counter = 0;
var sleepyAlert = setInterval(function(){
alert('Hello');
if(counter === endTime){
clearInterval(sleepyAlert);
}
counter += period;
}, period);
answered Jun 6 '13 at 13:48
Abel TerefeAbel Terefe
9821413
9821413
3
SetTimeout is much better than settinterval. google it and you will know
– Abdul Jabbar Dumrai
Feb 23 '14 at 22:26
13
I google it around a little and I found nothing, Why setInterval is bad ? Can you give us a link ? or an example ? Thanks
– Marcs
Mar 20 '16 at 22:08
I guess the point was thatSetInterval()
keeps spawning 'threads' even in the event of some error or block.
– Mateen Ulhaq
Nov 21 '17 at 1:00
add a comment |
3
SetTimeout is much better than settinterval. google it and you will know
– Abdul Jabbar Dumrai
Feb 23 '14 at 22:26
13
I google it around a little and I found nothing, Why setInterval is bad ? Can you give us a link ? or an example ? Thanks
– Marcs
Mar 20 '16 at 22:08
I guess the point was thatSetInterval()
keeps spawning 'threads' even in the event of some error or block.
– Mateen Ulhaq
Nov 21 '17 at 1:00
3
3
SetTimeout is much better than settinterval. google it and you will know
– Abdul Jabbar Dumrai
Feb 23 '14 at 22:26
SetTimeout is much better than settinterval. google it and you will know
– Abdul Jabbar Dumrai
Feb 23 '14 at 22:26
13
13
I google it around a little and I found nothing, Why setInterval is bad ? Can you give us a link ? or an example ? Thanks
– Marcs
Mar 20 '16 at 22:08
I google it around a little and I found nothing, Why setInterval is bad ? Can you give us a link ? or an example ? Thanks
– Marcs
Mar 20 '16 at 22:08
I guess the point was that
SetInterval()
keeps spawning 'threads' even in the event of some error or block.– Mateen Ulhaq
Nov 21 '17 at 1:00
I guess the point was that
SetInterval()
keeps spawning 'threads' even in the event of some error or block.– Mateen Ulhaq
Nov 21 '17 at 1:00
add a comment |
This will work
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
Try this fiddle: https://jsfiddle.net/wgdx8zqq/
1
This does trigger all timeout calls near the same time though
– Eddie
Apr 10 '18 at 19:19
the only thing I say, I have cracked this way, used$.Deferred
but it were some different scenario to let it worked, thumbs to you..!
– ArifMustafa
Oct 20 '18 at 6:55
add a comment |
This will work
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
Try this fiddle: https://jsfiddle.net/wgdx8zqq/
1
This does trigger all timeout calls near the same time though
– Eddie
Apr 10 '18 at 19:19
the only thing I say, I have cracked this way, used$.Deferred
but it were some different scenario to let it worked, thumbs to you..!
– ArifMustafa
Oct 20 '18 at 6:55
add a comment |
This will work
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
Try this fiddle: https://jsfiddle.net/wgdx8zqq/
This will work
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
Try this fiddle: https://jsfiddle.net/wgdx8zqq/
answered Apr 5 '17 at 6:56
Gsvp NagarajuGsvp Nagaraju
12914
12914
1
This does trigger all timeout calls near the same time though
– Eddie
Apr 10 '18 at 19:19
the only thing I say, I have cracked this way, used$.Deferred
but it were some different scenario to let it worked, thumbs to you..!
– ArifMustafa
Oct 20 '18 at 6:55
add a comment |
1
This does trigger all timeout calls near the same time though
– Eddie
Apr 10 '18 at 19:19
the only thing I say, I have cracked this way, used$.Deferred
but it were some different scenario to let it worked, thumbs to you..!
– ArifMustafa
Oct 20 '18 at 6:55
1
1
This does trigger all timeout calls near the same time though
– Eddie
Apr 10 '18 at 19:19
This does trigger all timeout calls near the same time though
– Eddie
Apr 10 '18 at 19:19
the only thing I say, I have cracked this way, used
$.Deferred
but it were some different scenario to let it worked, thumbs to you..!– ArifMustafa
Oct 20 '18 at 6:55
the only thing I say, I have cracked this way, used
$.Deferred
but it were some different scenario to let it worked, thumbs to you..!– ArifMustafa
Oct 20 '18 at 6:55
add a comment |
In ES6 (ECMAScript 2015) you can iterate with delay with generator and interval.
Generators, a new feature of ECMAScript 6, are functions that can be
paused and resumed. Calling genFunc does not execute it. Instead, it
returns a so-called generator object that lets us control genFunc’s
execution. genFunc() is initially suspended at the beginning of its
body. The method genObj.next() continues the execution of genFunc,
until the next yield.
(Exploring ES6)
Code example:
let arr = [1, 2, 3, 'b'];
let genObj = genFunc();
let val = genObj.next();
console.log(val.value);
let interval = setInterval(() => {
val = genObj.next();
if (val.done) {
clearInterval(interval);
} else {
console.log(val.value);
}
}, 1000);
function* genFunc() {
for(let item of arr) {
yield item;
}
}
So if you are using ES6, that the most elegant way to achieve loop with delay (for my opinion).
add a comment |
In ES6 (ECMAScript 2015) you can iterate with delay with generator and interval.
Generators, a new feature of ECMAScript 6, are functions that can be
paused and resumed. Calling genFunc does not execute it. Instead, it
returns a so-called generator object that lets us control genFunc’s
execution. genFunc() is initially suspended at the beginning of its
body. The method genObj.next() continues the execution of genFunc,
until the next yield.
(Exploring ES6)
Code example:
let arr = [1, 2, 3, 'b'];
let genObj = genFunc();
let val = genObj.next();
console.log(val.value);
let interval = setInterval(() => {
val = genObj.next();
if (val.done) {
clearInterval(interval);
} else {
console.log(val.value);
}
}, 1000);
function* genFunc() {
for(let item of arr) {
yield item;
}
}
So if you are using ES6, that the most elegant way to achieve loop with delay (for my opinion).
add a comment |
In ES6 (ECMAScript 2015) you can iterate with delay with generator and interval.
Generators, a new feature of ECMAScript 6, are functions that can be
paused and resumed. Calling genFunc does not execute it. Instead, it
returns a so-called generator object that lets us control genFunc’s
execution. genFunc() is initially suspended at the beginning of its
body. The method genObj.next() continues the execution of genFunc,
until the next yield.
(Exploring ES6)
Code example:
let arr = [1, 2, 3, 'b'];
let genObj = genFunc();
let val = genObj.next();
console.log(val.value);
let interval = setInterval(() => {
val = genObj.next();
if (val.done) {
clearInterval(interval);
} else {
console.log(val.value);
}
}, 1000);
function* genFunc() {
for(let item of arr) {
yield item;
}
}
So if you are using ES6, that the most elegant way to achieve loop with delay (for my opinion).
In ES6 (ECMAScript 2015) you can iterate with delay with generator and interval.
Generators, a new feature of ECMAScript 6, are functions that can be
paused and resumed. Calling genFunc does not execute it. Instead, it
returns a so-called generator object that lets us control genFunc’s
execution. genFunc() is initially suspended at the beginning of its
body. The method genObj.next() continues the execution of genFunc,
until the next yield.
(Exploring ES6)
Code example:
let arr = [1, 2, 3, 'b'];
let genObj = genFunc();
let val = genObj.next();
console.log(val.value);
let interval = setInterval(() => {
val = genObj.next();
if (val.done) {
clearInterval(interval);
} else {
console.log(val.value);
}
}, 1000);
function* genFunc() {
for(let item of arr) {
yield item;
}
}
So if you are using ES6, that the most elegant way to achieve loop with delay (for my opinion).
let arr = [1, 2, 3, 'b'];
let genObj = genFunc();
let val = genObj.next();
console.log(val.value);
let interval = setInterval(() => {
val = genObj.next();
if (val.done) {
clearInterval(interval);
} else {
console.log(val.value);
}
}, 1000);
function* genFunc() {
for(let item of arr) {
yield item;
}
}
let arr = [1, 2, 3, 'b'];
let genObj = genFunc();
let val = genObj.next();
console.log(val.value);
let interval = setInterval(() => {
val = genObj.next();
if (val.done) {
clearInterval(interval);
} else {
console.log(val.value);
}
}, 1000);
function* genFunc() {
for(let item of arr) {
yield item;
}
}
answered Oct 7 '15 at 15:26
Itay RadotzkiItay Radotzki
797179
797179
add a comment |
add a comment |
I do this with Bluebird’s Promise.delay
and recursion.
function myLoop(i) {
return Promise.delay(1000)
.then(function() {
if (i > 0) {
alert('hello');
return myLoop(i -= 1);
}
});
}
myLoop(3);
<script src="//cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.4/bluebird.min.js"></script>
add a comment |
I do this with Bluebird’s Promise.delay
and recursion.
function myLoop(i) {
return Promise.delay(1000)
.then(function() {
if (i > 0) {
alert('hello');
return myLoop(i -= 1);
}
});
}
myLoop(3);
<script src="//cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.4/bluebird.min.js"></script>
add a comment |
I do this with Bluebird’s Promise.delay
and recursion.
function myLoop(i) {
return Promise.delay(1000)
.then(function() {
if (i > 0) {
alert('hello');
return myLoop(i -= 1);
}
});
}
myLoop(3);
<script src="//cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.4/bluebird.min.js"></script>
I do this with Bluebird’s Promise.delay
and recursion.
function myLoop(i) {
return Promise.delay(1000)
.then(function() {
if (i > 0) {
alert('hello');
return myLoop(i -= 1);
}
});
}
myLoop(3);
<script src="//cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.4/bluebird.min.js"></script>
function myLoop(i) {
return Promise.delay(1000)
.then(function() {
if (i > 0) {
alert('hello');
return myLoop(i -= 1);
}
});
}
myLoop(3);
<script src="//cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.4/bluebird.min.js"></script>
function myLoop(i) {
return Promise.delay(1000)
.then(function() {
if (i > 0) {
alert('hello');
return myLoop(i -= 1);
}
});
}
myLoop(3);
<script src="//cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.4/bluebird.min.js"></script>
edited Jun 10 '18 at 23:50
Xufox
10.3k63151
10.3k63151
answered Feb 2 '15 at 9:06
Dave BryandDave Bryand
446411
446411
add a comment |
add a comment |
Just thought I'd post my two cents here as well. This function runs an iterative loop with a delay. See this jsfiddle. The function is as follows:
function timeout(range, time, callback){
var i = range[0];
callback(i);
Loop();
function Loop(){
setTimeout(function(){
i++;
if (i<range[1]){
callback(i);
Loop();
}
}, time*1000)
}
}
For example:
//This function prints the loop number every second
timeout([0, 5], 1, function(i){
console.log(i);
});
Would be equivalent to:
//This function prints the loop number instantly
for (var i = 0; i<5; i++){
console.log(i);
}
add a comment |
Just thought I'd post my two cents here as well. This function runs an iterative loop with a delay. See this jsfiddle. The function is as follows:
function timeout(range, time, callback){
var i = range[0];
callback(i);
Loop();
function Loop(){
setTimeout(function(){
i++;
if (i<range[1]){
callback(i);
Loop();
}
}, time*1000)
}
}
For example:
//This function prints the loop number every second
timeout([0, 5], 1, function(i){
console.log(i);
});
Would be equivalent to:
//This function prints the loop number instantly
for (var i = 0; i<5; i++){
console.log(i);
}
add a comment |
Just thought I'd post my two cents here as well. This function runs an iterative loop with a delay. See this jsfiddle. The function is as follows:
function timeout(range, time, callback){
var i = range[0];
callback(i);
Loop();
function Loop(){
setTimeout(function(){
i++;
if (i<range[1]){
callback(i);
Loop();
}
}, time*1000)
}
}
For example:
//This function prints the loop number every second
timeout([0, 5], 1, function(i){
console.log(i);
});
Would be equivalent to:
//This function prints the loop number instantly
for (var i = 0; i<5; i++){
console.log(i);
}
Just thought I'd post my two cents here as well. This function runs an iterative loop with a delay. See this jsfiddle. The function is as follows:
function timeout(range, time, callback){
var i = range[0];
callback(i);
Loop();
function Loop(){
setTimeout(function(){
i++;
if (i<range[1]){
callback(i);
Loop();
}
}, time*1000)
}
}
For example:
//This function prints the loop number every second
timeout([0, 5], 1, function(i){
console.log(i);
});
Would be equivalent to:
//This function prints the loop number instantly
for (var i = 0; i<5; i++){
console.log(i);
}
edited Aug 4 '16 at 17:02
answered Nov 6 '15 at 12:57
D SleeD Slee
57036
57036
add a comment |
add a comment |
You can use RxJS interval operator. Interval emits integer every x number of seconds, and take is specify number of times it has to emit numberss
Rx.Observable
.interval(1000)
.take(10)
.subscribe((x) => console.log(x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.min.js"></script>
add a comment |
You can use RxJS interval operator. Interval emits integer every x number of seconds, and take is specify number of times it has to emit numberss
Rx.Observable
.interval(1000)
.take(10)
.subscribe((x) => console.log(x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.min.js"></script>
add a comment |
You can use RxJS interval operator. Interval emits integer every x number of seconds, and take is specify number of times it has to emit numberss
Rx.Observable
.interval(1000)
.take(10)
.subscribe((x) => console.log(x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.min.js"></script>
You can use RxJS interval operator. Interval emits integer every x number of seconds, and take is specify number of times it has to emit numberss
Rx.Observable
.interval(1000)
.take(10)
.subscribe((x) => console.log(x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.min.js"></script>
Rx.Observable
.interval(1000)
.take(10)
.subscribe((x) => console.log(x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.min.js"></script>
Rx.Observable
.interval(1000)
.take(10)
.subscribe((x) => console.log(x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.min.js"></script>
answered Jun 23 '16 at 19:59
Vlad BezdenVlad Bezden
30.7k10135115
30.7k10135115
add a comment |
add a comment |
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 1000;
function functionToRun(i, length) {
alert(data[i]);
}
(function forWithDelay(i, length, fn, delay) {
setTimeout(function() {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
A modified version of Daniel Vassallo's answer, with variables extracted into parameters to make the function more reusable:
First let's define some essential variables:
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 3000;
Next you should define the function you want to run. This will get passed i, the current index of the loop and the length of the loop, in case you need it:
function functionToRun(i, length) {
alert(data[i]);
}
Self-executing version
(function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
Functional version
function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
}
forWithDelay(startIndex, data.length, functionToRun, timeout); // Lets run it
nice one and how do I pass data to the function without a global variable
– Sundara Prabu
May 29 '17 at 17:54
add a comment |
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 1000;
function functionToRun(i, length) {
alert(data[i]);
}
(function forWithDelay(i, length, fn, delay) {
setTimeout(function() {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
A modified version of Daniel Vassallo's answer, with variables extracted into parameters to make the function more reusable:
First let's define some essential variables:
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 3000;
Next you should define the function you want to run. This will get passed i, the current index of the loop and the length of the loop, in case you need it:
function functionToRun(i, length) {
alert(data[i]);
}
Self-executing version
(function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
Functional version
function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
}
forWithDelay(startIndex, data.length, functionToRun, timeout); // Lets run it
nice one and how do I pass data to the function without a global variable
– Sundara Prabu
May 29 '17 at 17:54
add a comment |
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 1000;
function functionToRun(i, length) {
alert(data[i]);
}
(function forWithDelay(i, length, fn, delay) {
setTimeout(function() {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
A modified version of Daniel Vassallo's answer, with variables extracted into parameters to make the function more reusable:
First let's define some essential variables:
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 3000;
Next you should define the function you want to run. This will get passed i, the current index of the loop and the length of the loop, in case you need it:
function functionToRun(i, length) {
alert(data[i]);
}
Self-executing version
(function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
Functional version
function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
}
forWithDelay(startIndex, data.length, functionToRun, timeout); // Lets run it
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 1000;
function functionToRun(i, length) {
alert(data[i]);
}
(function forWithDelay(i, length, fn, delay) {
setTimeout(function() {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
A modified version of Daniel Vassallo's answer, with variables extracted into parameters to make the function more reusable:
First let's define some essential variables:
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 3000;
Next you should define the function you want to run. This will get passed i, the current index of the loop and the length of the loop, in case you need it:
function functionToRun(i, length) {
alert(data[i]);
}
Self-executing version
(function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
Functional version
function forWithDelay(i, length, fn, delay) {
setTimeout(function () {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
}
forWithDelay(startIndex, data.length, functionToRun, timeout); // Lets run it
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 1000;
function functionToRun(i, length) {
alert(data[i]);
}
(function forWithDelay(i, length, fn, delay) {
setTimeout(function() {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
var startIndex = 0;
var data = [1, 2, 3];
var timeout = 1000;
function functionToRun(i, length) {
alert(data[i]);
}
(function forWithDelay(i, length, fn, delay) {
setTimeout(function() {
fn(i, length);
i++;
if (i < length) {
forWithDelay(i, length, fn, delay);
}
}, delay);
})(startIndex, data.length, functionToRun, timeout);
answered Mar 10 '16 at 15:22
Jasdeep KhalsaJasdeep Khalsa
3,36073055
3,36073055
nice one and how do I pass data to the function without a global variable
– Sundara Prabu
May 29 '17 at 17:54
add a comment |
nice one and how do I pass data to the function without a global variable
– Sundara Prabu
May 29 '17 at 17:54
nice one and how do I pass data to the function without a global variable
– Sundara Prabu
May 29 '17 at 17:54
nice one and how do I pass data to the function without a global variable
– Sundara Prabu
May 29 '17 at 17:54
add a comment |
/*
Use Recursive and setTimeout
call below function will run loop loopFunctionNeedCheck until
conditionCheckAfterRunFn = true, if conditionCheckAfterRunFn == false : delay
reRunAfterMs miliseconds and continue loop
tested code, thanks
*/
function functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn,
loopFunctionNeedCheck) {
loopFunctionNeedCheck();
var result = conditionCheckAfterRunFn();
//check after run
if (!result) {
setTimeout(function () {
functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn, loopFunctionNeedCheck)
}, reRunAfterMs);
}
else console.log("completed, thanks");
//if you need call a function after completed add code call callback in here
}
//passing-parameters-to-a-callback-function
// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
Function.prototype.bind = function () {
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function () {
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
//test code:
var result = 0;
console.log("---> init result is " + result);
var functionNeedRun = function (step) {
result+=step;
console.log("current result is " + result);
}
var checkResultFunction = function () {
return result==100;
}
//call this function will run loop functionNeedRun and delay 500 miliseconds until result=100
functionRepeatUntilConditionTrue(500, checkResultFunction , functionNeedRun.bind(null, 5));
//result log from console:
/*
---> init result is 0
current result is 5
undefined
current result is 10
current result is 15
current result is 20
current result is 25
current result is 30
current result is 35
current result is 40
current result is 45
current result is 50
current result is 55
current result is 60
current result is 65
current result is 70
current result is 75
current result is 80
current result is 85
current result is 90
current result is 95
current result is 100
completed, thanks
*/
7
Your function names are horrendous, that's the main reason why this code is so hard to read.
– Mark Walters
Nov 26 '13 at 15:11
add a comment |
/*
Use Recursive and setTimeout
call below function will run loop loopFunctionNeedCheck until
conditionCheckAfterRunFn = true, if conditionCheckAfterRunFn == false : delay
reRunAfterMs miliseconds and continue loop
tested code, thanks
*/
function functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn,
loopFunctionNeedCheck) {
loopFunctionNeedCheck();
var result = conditionCheckAfterRunFn();
//check after run
if (!result) {
setTimeout(function () {
functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn, loopFunctionNeedCheck)
}, reRunAfterMs);
}
else console.log("completed, thanks");
//if you need call a function after completed add code call callback in here
}
//passing-parameters-to-a-callback-function
// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
Function.prototype.bind = function () {
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function () {
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
//test code:
var result = 0;
console.log("---> init result is " + result);
var functionNeedRun = function (step) {
result+=step;
console.log("current result is " + result);
}
var checkResultFunction = function () {
return result==100;
}
//call this function will run loop functionNeedRun and delay 500 miliseconds until result=100
functionRepeatUntilConditionTrue(500, checkResultFunction , functionNeedRun.bind(null, 5));
//result log from console:
/*
---> init result is 0
current result is 5
undefined
current result is 10
current result is 15
current result is 20
current result is 25
current result is 30
current result is 35
current result is 40
current result is 45
current result is 50
current result is 55
current result is 60
current result is 65
current result is 70
current result is 75
current result is 80
current result is 85
current result is 90
current result is 95
current result is 100
completed, thanks
*/
7
Your function names are horrendous, that's the main reason why this code is so hard to read.
– Mark Walters
Nov 26 '13 at 15:11
add a comment |
/*
Use Recursive and setTimeout
call below function will run loop loopFunctionNeedCheck until
conditionCheckAfterRunFn = true, if conditionCheckAfterRunFn == false : delay
reRunAfterMs miliseconds and continue loop
tested code, thanks
*/
function functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn,
loopFunctionNeedCheck) {
loopFunctionNeedCheck();
var result = conditionCheckAfterRunFn();
//check after run
if (!result) {
setTimeout(function () {
functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn, loopFunctionNeedCheck)
}, reRunAfterMs);
}
else console.log("completed, thanks");
//if you need call a function after completed add code call callback in here
}
//passing-parameters-to-a-callback-function
// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
Function.prototype.bind = function () {
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function () {
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
//test code:
var result = 0;
console.log("---> init result is " + result);
var functionNeedRun = function (step) {
result+=step;
console.log("current result is " + result);
}
var checkResultFunction = function () {
return result==100;
}
//call this function will run loop functionNeedRun and delay 500 miliseconds until result=100
functionRepeatUntilConditionTrue(500, checkResultFunction , functionNeedRun.bind(null, 5));
//result log from console:
/*
---> init result is 0
current result is 5
undefined
current result is 10
current result is 15
current result is 20
current result is 25
current result is 30
current result is 35
current result is 40
current result is 45
current result is 50
current result is 55
current result is 60
current result is 65
current result is 70
current result is 75
current result is 80
current result is 85
current result is 90
current result is 95
current result is 100
completed, thanks
*/
/*
Use Recursive and setTimeout
call below function will run loop loopFunctionNeedCheck until
conditionCheckAfterRunFn = true, if conditionCheckAfterRunFn == false : delay
reRunAfterMs miliseconds and continue loop
tested code, thanks
*/
function functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn,
loopFunctionNeedCheck) {
loopFunctionNeedCheck();
var result = conditionCheckAfterRunFn();
//check after run
if (!result) {
setTimeout(function () {
functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn, loopFunctionNeedCheck)
}, reRunAfterMs);
}
else console.log("completed, thanks");
//if you need call a function after completed add code call callback in here
}
//passing-parameters-to-a-callback-function
// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
Function.prototype.bind = function () {
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function () {
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
//test code:
var result = 0;
console.log("---> init result is " + result);
var functionNeedRun = function (step) {
result+=step;
console.log("current result is " + result);
}
var checkResultFunction = function () {
return result==100;
}
//call this function will run loop functionNeedRun and delay 500 miliseconds until result=100
functionRepeatUntilConditionTrue(500, checkResultFunction , functionNeedRun.bind(null, 5));
//result log from console:
/*
---> init result is 0
current result is 5
undefined
current result is 10
current result is 15
current result is 20
current result is 25
current result is 30
current result is 35
current result is 40
current result is 45
current result is 50
current result is 55
current result is 60
current result is 65
current result is 70
current result is 75
current result is 80
current result is 85
current result is 90
current result is 95
current result is 100
completed, thanks
*/
answered Oct 24 '13 at 2:51
user2913925user2913925
29
29
7
Your function names are horrendous, that's the main reason why this code is so hard to read.
– Mark Walters
Nov 26 '13 at 15:11
add a comment |
7
Your function names are horrendous, that's the main reason why this code is so hard to read.
– Mark Walters
Nov 26 '13 at 15:11
7
7
Your function names are horrendous, that's the main reason why this code is so hard to read.
– Mark Walters
Nov 26 '13 at 15:11
Your function names are horrendous, that's the main reason why this code is so hard to read.
– Mark Walters
Nov 26 '13 at 15:11
add a comment |
Here is how I created an infinite loop with a delay that breaks on a certain condition:
// Now continuously check the app status until it's completed,
// failed or times out. The isFinished() will throw exception if
// there is a failure.
while (true) {
let status = await this.api.getStatus(appId);
if (isFinished(status)) {
break;
} else {
// Delay before running the next loop iteration:
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
The key here is to create a new Promise that resolves by timeout, and to await for its resolution.
Obviously you need async/await support for that. Works in Node 8.
add a comment |
Here is how I created an infinite loop with a delay that breaks on a certain condition:
// Now continuously check the app status until it's completed,
// failed or times out. The isFinished() will throw exception if
// there is a failure.
while (true) {
let status = await this.api.getStatus(appId);
if (isFinished(status)) {
break;
} else {
// Delay before running the next loop iteration:
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
The key here is to create a new Promise that resolves by timeout, and to await for its resolution.
Obviously you need async/await support for that. Works in Node 8.
add a comment |
Here is how I created an infinite loop with a delay that breaks on a certain condition:
// Now continuously check the app status until it's completed,
// failed or times out. The isFinished() will throw exception if
// there is a failure.
while (true) {
let status = await this.api.getStatus(appId);
if (isFinished(status)) {
break;
} else {
// Delay before running the next loop iteration:
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
The key here is to create a new Promise that resolves by timeout, and to await for its resolution.
Obviously you need async/await support for that. Works in Node 8.
Here is how I created an infinite loop with a delay that breaks on a certain condition:
// Now continuously check the app status until it's completed,
// failed or times out. The isFinished() will throw exception if
// there is a failure.
while (true) {
let status = await this.api.getStatus(appId);
if (isFinished(status)) {
break;
} else {
// Delay before running the next loop iteration:
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
The key here is to create a new Promise that resolves by timeout, and to await for its resolution.
Obviously you need async/await support for that. Works in Node 8.
edited Sep 27 '17 at 17:21
answered Sep 27 '17 at 16:58
K48K48
5,67494197
5,67494197
add a comment |
add a comment |
for common use "forget normal loops" and use this combination of "setInterval" includes "setTimeOut"s: like this (from my real tasks).
function iAsk(lvl){
var i=0;
var intr =setInterval(function(){ // start the loop
i++; // increment it
if(i>lvl){ // check if the end round reached.
clearInterval(intr);
return;
}
setTimeout(function(){
$(".imag").prop("src",pPng); // do first bla bla bla after 50 millisecond
},50);
setTimeout(function(){
// do another bla bla bla after 100 millisecond.
seq[i-1]=(Math.ceil(Math.random()*4)).toString();
$("#hh").after('<br>'+i + ' : rand= '+(Math.ceil(Math.random()*4)).toString()+' > '+seq[i-1]);
$("#d"+seq[i-1]).prop("src",pGif);
var d =document.getElementById('aud');
d.play();
},100);
setTimeout(function(){
// keep adding bla bla bla till you done :)
$("#d"+seq[i-1]).prop("src",pPng);
},900);
},1000); // loop waiting time must be >= 900 (biggest timeOut for inside actions)
}
PS: Understand that the real behavior of (setTimeOut): they all will start in same time "the three bla bla bla will start counting down in the same moment" so make a different timeout to arrange the execution.
PS 2: the example for timing loop, but for a reaction loops you can use events, promise async await ..
add a comment |
for common use "forget normal loops" and use this combination of "setInterval" includes "setTimeOut"s: like this (from my real tasks).
function iAsk(lvl){
var i=0;
var intr =setInterval(function(){ // start the loop
i++; // increment it
if(i>lvl){ // check if the end round reached.
clearInterval(intr);
return;
}
setTimeout(function(){
$(".imag").prop("src",pPng); // do first bla bla bla after 50 millisecond
},50);
setTimeout(function(){
// do another bla bla bla after 100 millisecond.
seq[i-1]=(Math.ceil(Math.random()*4)).toString();
$("#hh").after('<br>'+i + ' : rand= '+(Math.ceil(Math.random()*4)).toString()+' > '+seq[i-1]);
$("#d"+seq[i-1]).prop("src",pGif);
var d =document.getElementById('aud');
d.play();
},100);
setTimeout(function(){
// keep adding bla bla bla till you done :)
$("#d"+seq[i-1]).prop("src",pPng);
},900);
},1000); // loop waiting time must be >= 900 (biggest timeOut for inside actions)
}
PS: Understand that the real behavior of (setTimeOut): they all will start in same time "the three bla bla bla will start counting down in the same moment" so make a different timeout to arrange the execution.
PS 2: the example for timing loop, but for a reaction loops you can use events, promise async await ..
add a comment |
for common use "forget normal loops" and use this combination of "setInterval" includes "setTimeOut"s: like this (from my real tasks).
function iAsk(lvl){
var i=0;
var intr =setInterval(function(){ // start the loop
i++; // increment it
if(i>lvl){ // check if the end round reached.
clearInterval(intr);
return;
}
setTimeout(function(){
$(".imag").prop("src",pPng); // do first bla bla bla after 50 millisecond
},50);
setTimeout(function(){
// do another bla bla bla after 100 millisecond.
seq[i-1]=(Math.ceil(Math.random()*4)).toString();
$("#hh").after('<br>'+i + ' : rand= '+(Math.ceil(Math.random()*4)).toString()+' > '+seq[i-1]);
$("#d"+seq[i-1]).prop("src",pGif);
var d =document.getElementById('aud');
d.play();
},100);
setTimeout(function(){
// keep adding bla bla bla till you done :)
$("#d"+seq[i-1]).prop("src",pPng);
},900);
},1000); // loop waiting time must be >= 900 (biggest timeOut for inside actions)
}
PS: Understand that the real behavior of (setTimeOut): they all will start in same time "the three bla bla bla will start counting down in the same moment" so make a different timeout to arrange the execution.
PS 2: the example for timing loop, but for a reaction loops you can use events, promise async await ..
for common use "forget normal loops" and use this combination of "setInterval" includes "setTimeOut"s: like this (from my real tasks).
function iAsk(lvl){
var i=0;
var intr =setInterval(function(){ // start the loop
i++; // increment it
if(i>lvl){ // check if the end round reached.
clearInterval(intr);
return;
}
setTimeout(function(){
$(".imag").prop("src",pPng); // do first bla bla bla after 50 millisecond
},50);
setTimeout(function(){
// do another bla bla bla after 100 millisecond.
seq[i-1]=(Math.ceil(Math.random()*4)).toString();
$("#hh").after('<br>'+i + ' : rand= '+(Math.ceil(Math.random()*4)).toString()+' > '+seq[i-1]);
$("#d"+seq[i-1]).prop("src",pGif);
var d =document.getElementById('aud');
d.play();
},100);
setTimeout(function(){
// keep adding bla bla bla till you done :)
$("#d"+seq[i-1]).prop("src",pPng);
},900);
},1000); // loop waiting time must be >= 900 (biggest timeOut for inside actions)
}
PS: Understand that the real behavior of (setTimeOut): they all will start in same time "the three bla bla bla will start counting down in the same moment" so make a different timeout to arrange the execution.
PS 2: the example for timing loop, but for a reaction loops you can use events, promise async await ..
answered Dec 1 '17 at 8:27
Mohamed AbulnasrMohamed Abulnasr
327311
327311
add a comment |
add a comment |
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
for(var i=0; i<5; i++) {
var sno = i+1;
(function myLoop (i) {
setTimeout(function () {
alert(i); // Do your function here
}, 1000*i);
})(sno);
}
}
</script>
</body>
</html>
1
Please always provide at least brief description to your code snippets, at least for others to be sure that you address the question.
– Hexfire
Jan 23 '18 at 7:47
1
Code only answers arent encouraged as they dont provide much information for future readers please provide some explanation to what you have written
– WhatsThePoint
Jan 23 '18 at 7:58
add a comment |
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
for(var i=0; i<5; i++) {
var sno = i+1;
(function myLoop (i) {
setTimeout(function () {
alert(i); // Do your function here
}, 1000*i);
})(sno);
}
}
</script>
</body>
</html>
1
Please always provide at least brief description to your code snippets, at least for others to be sure that you address the question.
– Hexfire
Jan 23 '18 at 7:47
1
Code only answers arent encouraged as they dont provide much information for future readers please provide some explanation to what you have written
– WhatsThePoint
Jan 23 '18 at 7:58
add a comment |
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
for(var i=0; i<5; i++) {
var sno = i+1;
(function myLoop (i) {
setTimeout(function () {
alert(i); // Do your function here
}, 1000*i);
})(sno);
}
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
for(var i=0; i<5; i++) {
var sno = i+1;
(function myLoop (i) {
setTimeout(function () {
alert(i); // Do your function here
}, 1000*i);
})(sno);
}
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
for(var i=0; i<5; i++) {
var sno = i+1;
(function myLoop (i) {
setTimeout(function () {
alert(i); // Do your function here
}, 1000*i);
})(sno);
}
}
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function myFunction() {
for(var i=0; i<5; i++) {
var sno = i+1;
(function myLoop (i) {
setTimeout(function () {
alert(i); // Do your function here
}, 1000*i);
})(sno);
}
}
</script>
</body>
</html>
answered Jan 23 '18 at 7:40
Boginaathan MBoginaathan M
91
91
1
Please always provide at least brief description to your code snippets, at least for others to be sure that you address the question.
– Hexfire
Jan 23 '18 at 7:47
1
Code only answers arent encouraged as they dont provide much information for future readers please provide some explanation to what you have written
– WhatsThePoint
Jan 23 '18 at 7:58
add a comment |
1
Please always provide at least brief description to your code snippets, at least for others to be sure that you address the question.
– Hexfire
Jan 23 '18 at 7:47
1
Code only answers arent encouraged as they dont provide much information for future readers please provide some explanation to what you have written
– WhatsThePoint
Jan 23 '18 at 7:58
1
1
Please always provide at least brief description to your code snippets, at least for others to be sure that you address the question.
– Hexfire
Jan 23 '18 at 7:47
Please always provide at least brief description to your code snippets, at least for others to be sure that you address the question.
– Hexfire
Jan 23 '18 at 7:47
1
1
Code only answers arent encouraged as they dont provide much information for future readers please provide some explanation to what you have written
– WhatsThePoint
Jan 23 '18 at 7:58
Code only answers arent encouraged as they dont provide much information for future readers please provide some explanation to what you have written
– WhatsThePoint
Jan 23 '18 at 7:58
add a comment |
Simple implementation of showing a piece of text every two seconds as long the loop is running.
for (var i = 0; i < foo.length; i++) {
setInterval(function(){
console.log("I will appear every 2 seconds");
}, 2000);
break;
};
add a comment |
Simple implementation of showing a piece of text every two seconds as long the loop is running.
for (var i = 0; i < foo.length; i++) {
setInterval(function(){
console.log("I will appear every 2 seconds");
}, 2000);
break;
};
add a comment |
Simple implementation of showing a piece of text every two seconds as long the loop is running.
for (var i = 0; i < foo.length; i++) {
setInterval(function(){
console.log("I will appear every 2 seconds");
}, 2000);
break;
};
Simple implementation of showing a piece of text every two seconds as long the loop is running.
for (var i = 0; i < foo.length; i++) {
setInterval(function(){
console.log("I will appear every 2 seconds");
}, 2000);
break;
};
answered Nov 14 '18 at 16:26
squeekyDavesqueekyDave
489217
489217
add a comment |
add a comment |
To my knowledge the setTimeout
function is called asynchronously. What you can do is wrap the entire loop within an async function and await a Promise
that contains the setTimeout as shown:
var looper = async function () {
for (var start = 1; start < 10; start++) {
await new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("iteration: " + start.toString());
resolve(true);
}, 1000);
});
}
return true;
}
And then you call run it like so:
looper().then(function(){
console.log("DONE!")
});
Please take some time to get a good understanding of asynchronous programming.
add a comment |
To my knowledge the setTimeout
function is called asynchronously. What you can do is wrap the entire loop within an async function and await a Promise
that contains the setTimeout as shown:
var looper = async function () {
for (var start = 1; start < 10; start++) {
await new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("iteration: " + start.toString());
resolve(true);
}, 1000);
});
}
return true;
}
And then you call run it like so:
looper().then(function(){
console.log("DONE!")
});
Please take some time to get a good understanding of asynchronous programming.
add a comment |
To my knowledge the setTimeout
function is called asynchronously. What you can do is wrap the entire loop within an async function and await a Promise
that contains the setTimeout as shown:
var looper = async function () {
for (var start = 1; start < 10; start++) {
await new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("iteration: " + start.toString());
resolve(true);
}, 1000);
});
}
return true;
}
And then you call run it like so:
looper().then(function(){
console.log("DONE!")
});
Please take some time to get a good understanding of asynchronous programming.
To my knowledge the setTimeout
function is called asynchronously. What you can do is wrap the entire loop within an async function and await a Promise
that contains the setTimeout as shown:
var looper = async function () {
for (var start = 1; start < 10; start++) {
await new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("iteration: " + start.toString());
resolve(true);
}, 1000);
});
}
return true;
}
And then you call run it like so:
looper().then(function(){
console.log("DONE!")
});
Please take some time to get a good understanding of asynchronous programming.
answered Feb 23 at 22:35
Questionare232Questionare232
101112
101112
add a comment |
add a comment |
Here is a function that I use for looping over an array:
function loopOnArrayWithDelay(theArray, delayAmount, i, theFunction, onComplete){
if (i < theArray.length && typeof delayAmount == 'number'){
console.log("i "+i);
theFunction(theArray[i], i);
setTimeout(function(){
loopOnArrayWithDelay(theArray, delayAmount, (i+1), theFunction, onComplete)}, delayAmount);
}else{
onComplete(i);
}
}
You use it like this:
loopOnArrayWithDelay(YourArray, 1000, 0, function(e, i){
//Do something with item
}, function(i){
//Do something once loop has completed
}
add a comment |
Here is a function that I use for looping over an array:
function loopOnArrayWithDelay(theArray, delayAmount, i, theFunction, onComplete){
if (i < theArray.length && typeof delayAmount == 'number'){
console.log("i "+i);
theFunction(theArray[i], i);
setTimeout(function(){
loopOnArrayWithDelay(theArray, delayAmount, (i+1), theFunction, onComplete)}, delayAmount);
}else{
onComplete(i);
}
}
You use it like this:
loopOnArrayWithDelay(YourArray, 1000, 0, function(e, i){
//Do something with item
}, function(i){
//Do something once loop has completed
}
add a comment |
Here is a function that I use for looping over an array:
function loopOnArrayWithDelay(theArray, delayAmount, i, theFunction, onComplete){
if (i < theArray.length && typeof delayAmount == 'number'){
console.log("i "+i);
theFunction(theArray[i], i);
setTimeout(function(){
loopOnArrayWithDelay(theArray, delayAmount, (i+1), theFunction, onComplete)}, delayAmount);
}else{
onComplete(i);
}
}
You use it like this:
loopOnArrayWithDelay(YourArray, 1000, 0, function(e, i){
//Do something with item
}, function(i){
//Do something once loop has completed
}
Here is a function that I use for looping over an array:
function loopOnArrayWithDelay(theArray, delayAmount, i, theFunction, onComplete){
if (i < theArray.length && typeof delayAmount == 'number'){
console.log("i "+i);
theFunction(theArray[i], i);
setTimeout(function(){
loopOnArrayWithDelay(theArray, delayAmount, (i+1), theFunction, onComplete)}, delayAmount);
}else{
onComplete(i);
}
}
You use it like this:
loopOnArrayWithDelay(YourArray, 1000, 0, function(e, i){
//Do something with item
}, function(i){
//Do something once loop has completed
}
answered Jun 2 '15 at 1:38
PJeremyMaloufPJeremyMalouf
44759
44759
add a comment |
add a comment |
This script works for most things
function timer(start) {
setTimeout(function () { //The timer
alert('hello');
}, start*3000); //needs the "start*" or else all the timers will run at 3000ms
}
for(var start = 1; start < 10; start++) {
timer(start);
}
add a comment |
This script works for most things
function timer(start) {
setTimeout(function () { //The timer
alert('hello');
}, start*3000); //needs the "start*" or else all the timers will run at 3000ms
}
for(var start = 1; start < 10; start++) {
timer(start);
}
add a comment |
This script works for most things
function timer(start) {
setTimeout(function () { //The timer
alert('hello');
}, start*3000); //needs the "start*" or else all the timers will run at 3000ms
}
for(var start = 1; start < 10; start++) {
timer(start);
}
This script works for most things
function timer(start) {
setTimeout(function () { //The timer
alert('hello');
}, start*3000); //needs the "start*" or else all the timers will run at 3000ms
}
for(var start = 1; start < 10; start++) {
timer(start);
}
answered Mar 19 '16 at 2:00
Jaketr00Jaketr00
672632
672632
add a comment |
add a comment |
var timer, i = 10;
function myLoop () { // create a loop function
timer = setTimeout(function () {
document.getElementById("demo").innerHTML = i;
i--;
if (i >= 0) {
myLoop();
} else {
clearTimeout(timer); // clear timeout
document.getElementById("demo").innerHTML = "DOARRRR ..";
}
}, 1000);
}
myLoop();
<p id="demo">count</p>
add a comment |
var timer, i = 10;
function myLoop () { // create a loop function
timer = setTimeout(function () {
document.getElementById("demo").innerHTML = i;
i--;
if (i >= 0) {
myLoop();
} else {
clearTimeout(timer); // clear timeout
document.getElementById("demo").innerHTML = "DOARRRR ..";
}
}, 1000);
}
myLoop();
<p id="demo">count</p>
add a comment |
var timer, i = 10;
function myLoop () { // create a loop function
timer = setTimeout(function () {
document.getElementById("demo").innerHTML = i;
i--;
if (i >= 0) {
myLoop();
} else {
clearTimeout(timer); // clear timeout
document.getElementById("demo").innerHTML = "DOARRRR ..";
}
}, 1000);
}
myLoop();
<p id="demo">count</p>
var timer, i = 10;
function myLoop () { // create a loop function
timer = setTimeout(function () {
document.getElementById("demo").innerHTML = i;
i--;
if (i >= 0) {
myLoop();
} else {
clearTimeout(timer); // clear timeout
document.getElementById("demo").innerHTML = "DOARRRR ..";
}
}, 1000);
}
myLoop();
<p id="demo">count</p>
var timer, i = 10;
function myLoop () { // create a loop function
timer = setTimeout(function () {
document.getElementById("demo").innerHTML = i;
i--;
if (i >= 0) {
myLoop();
} else {
clearTimeout(timer); // clear timeout
document.getElementById("demo").innerHTML = "DOARRRR ..";
}
}, 1000);
}
myLoop();
<p id="demo">count</p>
var timer, i = 10;
function myLoop () { // create a loop function
timer = setTimeout(function () {
document.getElementById("demo").innerHTML = i;
i--;
if (i >= 0) {
myLoop();
} else {
clearTimeout(timer); // clear timeout
document.getElementById("demo").innerHTML = "DOARRRR ..";
}
}, 1000);
}
myLoop();
<p id="demo">count</p>
answered Feb 18 '18 at 14:41
anteloveantelove
72557
72557
add a comment |
add a comment |
Try this...
var icount=0;
for (let i in items) {
icount=icount+1000;
new beginCount(items[i],icount);
}
function beginCount(item,icount){
setTimeout(function () {
new actualFunction(item,icount);
}, icount);
}
function actualFunction(item,icount){
//...runs ever 1 second
console.log(icount);
}
add a comment |
Try this...
var icount=0;
for (let i in items) {
icount=icount+1000;
new beginCount(items[i],icount);
}
function beginCount(item,icount){
setTimeout(function () {
new actualFunction(item,icount);
}, icount);
}
function actualFunction(item,icount){
//...runs ever 1 second
console.log(icount);
}
add a comment |
Try this...
var icount=0;
for (let i in items) {
icount=icount+1000;
new beginCount(items[i],icount);
}
function beginCount(item,icount){
setTimeout(function () {
new actualFunction(item,icount);
}, icount);
}
function actualFunction(item,icount){
//...runs ever 1 second
console.log(icount);
}
Try this...
var icount=0;
for (let i in items) {
icount=icount+1000;
new beginCount(items[i],icount);
}
function beginCount(item,icount){
setTimeout(function () {
new actualFunction(item,icount);
}, icount);
}
function actualFunction(item,icount){
//...runs ever 1 second
console.log(icount);
}
answered May 9 '18 at 9:45
PHILL BOOTHPHILL BOOTH
636
636
add a comment |
add a comment |
Try this
//the code will execute in 1 3 5 7 9 seconds later
function exec(){
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(new Date()); //It's you code
},(i+i+1)*1000);
}
}
add a comment |
Try this
//the code will execute in 1 3 5 7 9 seconds later
function exec(){
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(new Date()); //It's you code
},(i+i+1)*1000);
}
}
add a comment |
Try this
//the code will execute in 1 3 5 7 9 seconds later
function exec(){
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(new Date()); //It's you code
},(i+i+1)*1000);
}
}
Try this
//the code will execute in 1 3 5 7 9 seconds later
function exec(){
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(new Date()); //It's you code
},(i+i+1)*1000);
}
}
edited Nov 4 '15 at 9:36
MarmiK
4,55342841
4,55342841
answered Nov 3 '15 at 11:58
Steve JiangSteve Jiang
347313
347313
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f3583724%2fhow-do-i-add-a-delay-in-a-javascript-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown