JavaScript, 如何在for循环中添加超时?
JavaScript, How to add timeout inside the for loop?
这是原始代码。
var randomNumber = [1, 2, 3, 4];
var currentNumber = randomNumber.length
for (i=0; i < currentNumber; i++) {
$("#"+randomNumber[i]).fadeIn(100).fadeOut(100).fadeIn(100);
}
我想每 1 秒获取每个 randomNumber 项。
请帮帮我..
const randomNumber = [1, 2, 3, 4];
const currentNumber = randomNumber.length;
for (let i=0; i < currentNumber; i++) {
setTimeout(() => {
const random = Math.floor(Math.random() * randomNumber.length);
$("#" + random).fadeIn(100).fadeOut(100).fadeIn(100);
}, 1000);
}
const randomNumber = [1, 2, 3, 4];
setInterval(() => {
const randomElement = randomNumber[Math.floor(Math.random() * randomNumber.length)];
console.log(randomElement);
}, 1000);
const randomNumber = [1, 2, 3, 4];
for (i=0; i < randomNumber.length; i++) {
setTimeout(function() {
$("#" + randomNumber[i]).fadeIn(100).fadeOut(100).fadeIn(100);
}, i * 1000);
}
当调用 setTimeout 或 setInterval 时,浏览器中的计时器线程开始倒计时,当时间到时将回调函数放入 javascript 线程的执行堆栈。回调函数不会在堆栈中它上面的其他函数完成之前执行。所以在这种情况下,forloop 首先执行,然后设置的超时开始执行。
所以我放了一些延迟并乘以元素,这样当它在循环内执行时,它只会一个接一个地增加延迟值。
在我的版本中,我首先创建了 id 数组 arr
的随机版本 (vis
)。然后我 .pop()
每次触发 interval 函数时从中获取一个 id。当 vis
.
中没有可用的 ID 时,间隔将被清除
function shfl(arr) { let a=[...arr];
for (var j,i = a.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i+1));
[a[i],a[j]]=[a[j],a[i]];
} return a;
}
const arr=["a1","a2","a3","a4"];
function showdivs(ar){
var vis=shfl(ar);
return function(){
if (vis.length)
document.getElementById(vis.pop()).style.visibility="visible";
else clearInterval(hndl);
}
}
const hndl=setInterval(showdivs(arr),1000);
#cont div { visibility: hidden }
<div id="cont">
<div id="a1">one</div>
<div id="a2">two</div>
<div id="a3">three</div>
<div id="a4">four</div>
</div>
进一步说明:函数 showdivs()
是一个 生成器函数 ,它创建一个范围来设置随机排列的数组 vis
然后 returns实际在setInterval()
.
控制下被反复调用的函数
这是原始代码。
var randomNumber = [1, 2, 3, 4];
var currentNumber = randomNumber.length
for (i=0; i < currentNumber; i++) {
$("#"+randomNumber[i]).fadeIn(100).fadeOut(100).fadeIn(100);
}
我想每 1 秒获取每个 randomNumber 项。
请帮帮我..
const randomNumber = [1, 2, 3, 4];
const currentNumber = randomNumber.length;
for (let i=0; i < currentNumber; i++) {
setTimeout(() => {
const random = Math.floor(Math.random() * randomNumber.length);
$("#" + random).fadeIn(100).fadeOut(100).fadeIn(100);
}, 1000);
}
const randomNumber = [1, 2, 3, 4];
setInterval(() => {
const randomElement = randomNumber[Math.floor(Math.random() * randomNumber.length)];
console.log(randomElement);
}, 1000);
const randomNumber = [1, 2, 3, 4];
for (i=0; i < randomNumber.length; i++) {
setTimeout(function() {
$("#" + randomNumber[i]).fadeIn(100).fadeOut(100).fadeIn(100);
}, i * 1000);
}
当调用 setTimeout 或 setInterval 时,浏览器中的计时器线程开始倒计时,当时间到时将回调函数放入 javascript 线程的执行堆栈。回调函数不会在堆栈中它上面的其他函数完成之前执行。所以在这种情况下,forloop 首先执行,然后设置的超时开始执行。
所以我放了一些延迟并乘以元素,这样当它在循环内执行时,它只会一个接一个地增加延迟值。
在我的版本中,我首先创建了 id 数组 arr
的随机版本 (vis
)。然后我 .pop()
每次触发 interval 函数时从中获取一个 id。当 vis
.
function shfl(arr) { let a=[...arr];
for (var j,i = a.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i+1));
[a[i],a[j]]=[a[j],a[i]];
} return a;
}
const arr=["a1","a2","a3","a4"];
function showdivs(ar){
var vis=shfl(ar);
return function(){
if (vis.length)
document.getElementById(vis.pop()).style.visibility="visible";
else clearInterval(hndl);
}
}
const hndl=setInterval(showdivs(arr),1000);
#cont div { visibility: hidden }
<div id="cont">
<div id="a1">one</div>
<div id="a2">two</div>
<div id="a3">three</div>
<div id="a4">four</div>
</div>
进一步说明:函数 showdivs()
是一个 生成器函数 ,它创建一个范围来设置随机排列的数组 vis
然后 returns实际在setInterval()
.