行内循环未执行

用户名
var games = [];
var numbers_to_letters = ["one", "two", "three", "four", "five", "six"]

function Game(){
    roll_animation();
}

$("#roll_dice").click(function(){
    games.push(new Game());
});

function roll_animation(){
    for (var i = 0; i < 100; i++){
        for (var j = 0; j < 5; j++){
            (function(ind){
                window.setTimeout(function(){
                    $(".btn.btn-die").addClass(numbers_to_letters[ind+1]).removeClass(numbers_to_letters[ind]);
                }, 20 * (ind + 1));
            })(j);
        }
        $(".btn.btn-die").addClass("one").removeClass("six");
    }
}

除非再次按下按钮,否则第一个循环的最后一行不会执行,导致第二个循环仅运行一次。(它需要重设才能再次工作)为什么最后一行总是不执行?

jfriend00

这似乎是setTimeout()功能稍后运行的异步代码的问题,因此与循环中的其他代码不同步。

有问题的代码行:

$(".btn.btn-die").addClass("one").removeClass("six");

运行正常。但是,由于这些setTimeout()调用是安排在稍后的某个计时器上执行的,因此它们都在上一行运行之后全部运行。因此,这行代码开始运行,然后setTimeout()计时器开始触发,并且以上行的效果被覆盖。这就是您的代码指示它执行的操作。

如果放慢时间,您可以在此鳕鱼演示中看到这里发生的情况:http : //jsfiddle.net/jfriend00/tqYq7/

如果您要使上面的代码行在最后一个计时器触发后运行,那么您需要编写代码来执行此操作,而不是现在编写该代码。对于我来说,目前尚不清楚您正在尝试使用此行代码做什么,因此我不确定确切要推荐什么。

有人可能会问为什么还要设置500个计时器,其中大多数计时器将在完全相同的时间启动并运行完全相同的代码?当然,有更有效的方法可以循环运行某些内容。如果您真正想做的是一次运行一次内部动画100次,那么您将不得不完全不同地编写代码,因为您现在要做的是设置100个相同计时器的副本,所有这些计时器都计划运行同时关闭。

这是一个演示程序的另一种演示方法,它没有您遇到的问题。

工作演示:http : //jsfiddle.net/jfriend00/Zsa8m/

var games = [];
var numbers_to_letters = ["one", "two", "three", "four", "five", "six"];

function Game(){
    roll_animation();
}

$("#roll_dice").click(function(){
    games.push(new Game());
});

function roll_animation(){
    var cntr = 0;

    function next() {
        var die = cntr % 6;
        var nextDie = (die + 1) % 6;
        $(".btn.btn-die")
            .addClass(numbers_to_letters[nextDie])
            .removeClass(numbers_to_letters[die]);
        ++cntr;
        // keep going as long as cntr < 100 and we aren't on number 1
        // so that the die always end on 1
        if (cntr < 100 || nextDie != 0) {
            setTimeout(next, 50);
        }
    }
    next();
}

您显然可以更改常数以适合您的目的。

仅出于笑容,这是一个随机滚动而不是顺序滚动的版本:http : //jsfiddle.net/jfriend00/NSW8U/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章