Javascript while setTimeout

Javascript while setTimeout

我想制作一个 GreaseMonkey 脚本。我想在结束时有一个 setTimeout,但我不知道该怎么做。

run();
function run(){
  var klovas = document.getElementById("light").innerHTML;
  var btn = document.getElementsByClassName("farm_icon farm_icon_a");
  if(klovas < 6){
    alert("Kevés egység van");
  } else {
    var i = 0;
    while (i < btn.length){
      if(typeof btn[i] != "undefined"){
        btn[i].click();
      }
    i++;
    setTimeout("run()", 3000);
    }
  }
}

使用此代码,问题是 setTimeout 不工作并且没有像预期的那样等待 3 秒。

我尝试了其他方法,但没有任何效果。

编辑

function run(){
  var klovas = document.getElementById("light").innerHTML;
  var btn = document.getElementsByClassName("farm_icon farm_icon_a");
  if(klovas < 2){
    alert("Kevés egység van");
  } else {
    var i = 0;
    while (i < btn.length){
      if(typeof btn[i] != "undefined"){
        btn[i].click();
      }
    i++;    
    }
  }
}
setInterval(run, 6000); 

我试过了。它每 6 秒运行一次,但我在网站上遇到错误,我可以在一秒钟内点击超过 5 次。所以当我打开页面时等待 6 秒,点击后,我得到错误。它不是喷射工作。 :(

这里有一些问题。

首先,虽然 setTimeout 可以接受一个函数作为其第一个参数,但您可能希望将函数作为参数传递,而不是执行该函数,因此您应该将 "run()" 替换为 run

其次,我不太确定您为什么要递归 - 为什么 setTimeoutrun() 中?不要将它放在 运行 函数中,而是尝试将它放在底部,并删除顶部的 run() 调用。据我所知,这段代码完全没有理由需要递归。

如果您希望它只触发一次:

function run(){
    var data = [1,2,3];
    var i = 0;
    while (i < data.length) {
        console.log(data[i]);
        i++;
    }
}

setTimeout(run, 3000);

按照你现在写的方式,它会每 3 秒重复一次。

function run(){
    var data = [1,2,3];
    var i = 0;
    while (i < data.length) {
        console.log(data[i]);
        i++;
    }
    setTimeout(run, 3000);
}

run();

但是 setInterval 会达到相同的结果。

function run(){
    var data = [1,2,3];
    var i = 0;
    while (i < data.length) {
        console.log(data[i]);
        i++;
    }
}

setInterval(run, 3000);

编辑

用户想看看如果从回调函数内部调用 setInterval 会发生什么。请注意,间隔数每 3 秒呈指数增长。

setInterval 导致函数 运行 every 3 秒,而 setTimeout 导致函数 运行 once 3秒后。

var numberOfIntervals = 0;

function run(){
    setInterval(run, 3000);
    numberOfIntervals++;
    console.log(numberOfIntervals);
}

run();