I have an arrays=[John; Alex; Mark]
, I wanna to show the elements of this array one by one by 3 second delay.
for (var i=0; i<=3; i++)
{
setTimeout
starts with a lower case s
3000 * i
, not 3000
or they'll all fire at oncei
, not the values it had as you went through the loop.This works, and completely avoids the loop variable issue:
var s = ['John', 'Mark', 'Alex'];
var i = 0;
(function loop() {
x.innerHTML = s[i];
if (++i < s.length) {
setTimeout(loop, 3000); // call myself in 3 seconds time if required
}
})(); // above function expression is called immediately to start it off
Note how it uses "pseudo-recursion" to trigger the next iteration 3000ms after the completion of the previous iteration. This is preferable to having n
outstanding timers all waiting at the same time.
See http://jsfiddle.net/alnitak/mHQVz/
If you do not use closure, you will end up with i being undefined. This is because in each iteration you are overriding what i is. By the time it finishes, it will be undefined. Using a closure will preserve i.
On another note, it's kind of pointless to hard code in values (i.e. i<3) when you can just check for length. This way, if s ever changes, you for loop will still grab everything.
var s = ['john','mark','brian'];
for (var i = 0; i < s.length; i++) {
(function(i) {
setTimeout(function() {
x.innerHTML = s[i];
}, 3000*(i+1));
})(i);
}
Try
var s=['John', 'Alex', 'Mark'];
var x = document.getElementById('x');
function display(i){
if(i >= s.length){
i = 0;
}
x.innerHTML = s[i];
setTimeout(function(){
display(i + 1)
}, 2000)
}
display(0)
Demo: Fiddle
Your code won't work, since you set four timeouts of 2000 milliseconds (i.e. 2 seconds) at a time. You'd better use closure that sets three timeouts (by number of elements in array) with 3000 milliseconds of delay. It can be done with the following code (note that setTimeout
is written from the small letter):
var s = ["John", "Alex", "Mark"];
for (var i = 0; i < s.length; i++) {
(function(i) {
setTimeout(function() {
x.innerHTML = s[i];
}, 3000 * i);
})(i);
}
DEMO: http://jsfiddle.net/6Ne6z/
this will also help:
const fruits = ['apple', 'banana', 'mango', 'guava'];
let index = 0;
const primtMe = (value, i) => {
if (i < fruits.length) {
setTimeout(() => {
console.log(i + ' value = ' + value)
primtMe(fruits[i + 1], i + 1)
}, 3000);
} else {
return;
}
}
primtMe(fruits[index], index)
You can use setInterval
to show elements one by one after 3 seconds delay:
s=["John", "Alex", "Mark"];
var i = 0;
var id = setInterval(function(){
if(i > s.length) {
clearInterval(id);
}
else{
console.log(s[i++]);
}
}, 3000);