setTimeout时的Javascript

时间:2017-01-18 20:22:13

标签: javascript while-loop settimeout greasemonkey

我想制作一个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秒,然后点击,我得到错误。它没有喷射工作。 :(

2 个答案:

答案 0 :(得分:0)

这里有一些问题。

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

其次,我不确定你为什么会复发 - 为什么setTimeout里面有run()?不要将其放在run函数中,而是将其放在底部,并删除顶部的run()调用。据我所知,这个代码没有理由需要在alll上进行递归。

答案 1 :(得分:0)

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

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使函数运行 3秒,而setTimeout使函数在3秒内运行一次

var numberOfIntervals = 0;

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

run();