Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中的每次迭代中以随机间隔运行setTimeout()?_Javascript - Fatal编程技术网

如何在javascript中的每次迭代中以随机间隔运行setTimeout()?

如何在javascript中的每次迭代中以随机间隔运行setTimeout()?,javascript,Javascript,我试图在一个字符串数组上迭代,迭代的每一步都有几毫秒的延迟。类似于下面的内容- var l = ['a', 'b', 'c']; var delay = 5000; for(var i = 0;i < l.lenght;i++) { document.querySelectorAll("a[title='" + l[i] + "']")[0].parentNode.children[0].click(); delay = 5000 + Math.floor(Math.ran

我试图在一个字符串数组上迭代,迭代的每一步都有几毫秒的延迟。类似于下面的内容-

var l = ['a', 'b', 'c'];
var delay = 5000;
for(var i = 0;i < l.lenght;i++) {
    document.querySelectorAll("a[title='" + l[i] + "']")[0].parentNode.children[0].click();
    delay = 5000 + Math.floor(Math.random() * 5000) + 1;
   **<WAIT for 'delay' number of milliseconds**
}
var l=['a','b','c']; var延迟=5000; 对于(变量i=0;i** 你能试着用这样的函数替换延迟变量吗

var i = 0;
var interval = setInterval(
function() {
  if (i < l.length) {
    document.querySelectorAll("a[title='" + l[i] + "']")[0].parentNode.children[0].click();
    i++;
  }
  else {
    clearInterval(interval);
  }
},
function() {
  return 5000 + Math.floor(Math.random() * 5000) + 1;
}
);
var i=0;
var interval=setInterval(
函数(){
如果(i
setInterval
,您在示例中使用过它,它每(大约)N毫秒初始化一次回调,其中N是固定的。您以后必须使用
clearInterval
清除它

setTimeout
另一方面意味着-在~N次后调用我的回调。然后,您可以在回调中调用另一个
setTimeout
,使用不同的N

例如:

function callback() {
  /* 
    your logic here
  */
  delay = 5000 + Math.floor(Math.random() * 5000) + 1);
  setTimeout(callback, delay); // for your "clearInterval" case - just don't invoke this
}

setTimeout(callback, initialDelay);

您可以为此创建递归计时器函数:

请尝试以下操作:

函数displayValue(){
设arr=['a','b','c'];
设延时=1000;
设i=0;
函数时间函数(i){
如果(i==arr.length)
回来
设置超时(()=>{
控制台日志(arr[i]);
i++;
时间函数(i);
},延误);
延迟=延迟+1000+数学地板(数学随机()*4000);
} 
时间函数(i);
}

displayValue();
这个线程似乎是我发现的最接近于如何以随机时间间隔遍历数组这一基本问题的线程,这并不像人们想象的那么容易。 虽然对于所问的特定问题来说可能有点笼统,但当前接受的答案看起来与基本问题最为接近。下面的代码是一个小修改,它看起来在第一次通过时提供一个随机延迟,并在记录每个数组值后记录每个随机延迟

function displayValue(){

    let arr = ['a', 'b', 'c','d', 'e'];
      let delay = Math.floor(Math.random()*10000);  
      let i = 0;
      
      function timerFunction(i){
         if(i === arr.length)
          return;
          setTimeout(()=>{
            console.log(arr[i]);
            console.log(`delay was ${Math.floor(delay/1000)} seconds`);
            i++;
            timerFunction(i);
          }, delay);
          delay = Math.floor(Math.random()*10000);
      } 
      
      timerFunction(i);
    }
    
    displayValue();
上述修改的价值可能取决于上下文

有趣的是,应用bootcamp对forEach的介绍提供了另一种解决方案,它可能与OP更密切相关

var colors = ["red", "green", "blue", "yellow"];

function printArr(x){
    var random = Math.round(Math.random()*60000);
    setTimeout(() => {
        console.log(x);
        console.log(`Delay was ${Math.floor(random/1000)} seconds`)
    }, random);
};
colors.forEach(printArr);

谢谢你的解释。是的,我在我的示例中错误地提到了setTimeout(),现在我发现我最初使用setInterval()的方法永远不会奏效。谢谢。它会改变每次迭代的延迟吗?如果会,这可能是最简单的解决方案。我会尝试一下。
var colors = ["red", "green", "blue", "yellow"];

function printArr(x){
    var random = Math.round(Math.random()*60000);
    setTimeout(() => {
        console.log(x);
        console.log(`Delay was ${Math.floor(random/1000)} seconds`)
    }, random);
};
colors.forEach(printArr);