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().

控制下被反复调用的函数