【问题标题】:My For loop is incorrectly timed, what's wrong?我的 For 循环计时不正确,怎么了?
【发布时间】:2014-09-16 22:49:14
【问题描述】:

我的 For 循环有问题,因为某些原因它没有正确计时。我让它每 5 秒点击一次我的“外星人”(您将在代码中看到),并且每次购买工人时它都会增加。因此,如果您有 2 个工人,则每 5 秒有 2 个外星人,每 5 秒有 3 个外星人,依此类推。但是,当我有 2 个或更多工人时,就像我想为每个工人点击外星人两次一样。

我想要的: 1 个 worker = 每 5 秒自动点击一次 // 2 个工人 = 每 5 秒自动点击两次 等等

它错误地做了什么: 1 名工人按我的意愿工作// 2名工人=每5秒自动点击两次,每次点击价值2 等等

这是运行 for 循环的变量:

var workerCheck = setInterval(function(){
        var workers = parseInt($("#Workers").text());
            if( workers > 0 ){
                for(var i = 0; i < workers; i++){
                $("#Alien").click();       
                }
            }
    },5000);

这是我整个代码的 pastebin 链接:http://pastebin.com/ApwQgG4w

希望我的问题有意义,例如,如果我有 2 个工人,它将每 5 秒将“外星人”值设置为 4,而我只想要 2,对于 3,我希望每 5 秒有 3 个外星人,而不是 9,等等。

【问题讨论】:

  • 您在问题中提供的代码不足以重现问题。如果您编辑您的问题以提供能够重现问题的最小示例,这将对您和我们都有帮助。这样做,您可能会发现自己的错误。
  • 看来您可能需要在重置之前清除workerCheck 间隔。否则,您的代码将在您每次雇用工人时添加另一个计时器。 clearInterval().
  • @TomFenech 我不明白?我提供的代码就是我的全部吗?我试图找出它为什么坏了。当我有 2 个工人时,它会在外星人计数器上增加 2,但是它每 5 秒执行两次。所以在 5 秒内,我将得到 4 而不是我想要的 2。这发生在超过 1 名工人的所有事情上。
  • 我刚刚测试了您问题中的代码,将元素 click() 替换为 console.log,它每 5 秒只触发两次。
  • @TomFenech 这是一个例子。当我购买了 2 个工人时,我希望它每 5 秒自动单击我的外星人两次。 5 秒过去后,我的总数应该增加 2。但是,无论出于何种原因,它目前增加了 4,我不知道为什么。这只是一个例子,每个工人数量超过 1 时都会发生这种情况。

标签: javascript jquery html for-loop


【解决方案1】:

您可能需要在重置之前清除间隔。

当您单击“雇用工人”两次时,会创建两个计时器。这是demonstration。无论按钮被点击多少次,您都只需要一个计时器。

当您调用setTimer() 时,它会返回一个唯一的整数,您可以稍后使用它来引用该计时器。由于您总是将相同的变量workerCheck 设置(覆盖)为计时器的唯一整数,因此workerCheck 变量只能引用最新的计时器。这是demonstration

我建议你每次重置计时器时清除它:

$(function () {
    $('#Purchase').click(function () {
        automaticCounter();
    });

    // set variable with broader scope
    var workerCheck;

    function automaticCounter() {
        var workers = parseInt($("#Workers").text());
        workers = isNaN(workers) ? 0 : ++workers;

        $("#Workers").text(workers);

        var autoCounter = parseInt($("#Aliens").text());
        autoCounter = isNaN(autoCounter) ? 0 : autoCounter - 10 * workers;

        $("#Aliens").text(autoCounter);

        // clear the timer
        clearInterval(workerCheck);

        // set the timer
        workerCheck = setInterval(function () {
            var workers = parseInt($("#Workers").text());
            if (workers > 0) {
                for (var i = 0; i < workers; i++) {
                    $("#Alien").click();
                }
            }
        }, 5000);
    }
});

WORKING EXAMPLE

【讨论】:

  • jsfiddle.net/3z3765yn 上进行类似的操作,唯一真正的区别是检查和设置workerCheck 变量的null,而不是依赖未初始化的值。
【解决方案2】:

希望我理解正确。

这是一个小而酷的小提琴:FIDDLE

您的代码已编辑并且现在可以使用:FIDDLE

var workers = 0;
var workerCheck = setInterval(function(){
    workers = parseInt($("#workers").val());
        if( workers > 0 ){
            for(var i = 0; i < workers; i++){
            $("#Alien").trigger('click');       
            }
        }
},1000);

你的代码有什么问题:我不知道它有点乱,我编辑了它,它现在可以工作了。

【讨论】:

  • 那么原来的代码有什么区别和问题?
  • 别有点乱,加了他的代码,修好了。
  • 你的第二把小提琴似乎工作得很好。看起来你的计时器一直在运行。拥有一个更新整个显示的全局计时器并不是一个坏主意,而不是在您实际单击按钮时设置计时器。看起来更干净了。
  • @showdev - 同意,但这真的取决于他到底在做什么(不清楚)假设我购买了 2 个工人(数据库已更新或 cookie),现在页面已刷新 - 计时器未运行直到你购买一个新的:) 但正如我所说,这真的取决于他在做什么,这还不清楚。
  • 完全同意。您的“刷新页面”用例是常量计时器方法优越性的一个很好的例子。我还认为您的方法可以在将来为其他逻辑提供更大的灵活性,而无需添加更多独立的计时器。但是,是的,一切都取决于 OP 所需的功能。
猜你喜欢
  • 1970-01-01
  • 2013-10-23
  • 2022-08-05
  • 2022-11-28
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多