使用链式setTimeouts的jQuery Promises

时间:2016-04-27 16:15:18

标签: javascript jquery

我正在做一个小骰子游戏来学习。 我做的是我骰子X的次数碾压,随机减慢直到达到最终值,这就是#34;中奖号码"。

但我想在骰子上逐一执行scrumble。想象一下,我得到2.后来我做了一点缩放效果。 我以为我可以通过使用承诺实现这一点,但不适合我,我不知道我错过了什么。

这是JS代码:

var counter = 0.8;
var diceNumber = 0;

var rollDice = function(diceId){
    var dfd = new $.Deferred();

    $('#' + diceId).removeClass('idle');

    counter *= 1.2;

    diceNumber = Math.round(Math.random()*5) + 1;

    $('#' + diceId).removeClass();
    $('#' + diceId).addClass('dice_' + diceNumber);

    if(counter < 800) {
        timeout = setTimeout(rollDice, counter, diceId);
    }else{
        $('.winner').text(diceNumber);
        $('#' + diceId).removeClass();
        $('#' + diceId).addClass('animate');
        $('#' + diceId).addClass('dice_' + diceNumber)
        .animate({ zoom: '1.3' }, 200)
        .animate({ zoom: '1' }, 100);

        dfd.resolve();

        return dfd.promise();
    } 
}


var startToDice = function() {
    rollDice('dice_1').then(rollDice('dice_2'));
}

startToDice();

它最终做的是同时运行两个骰子。

有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:3)

你走在正确的轨道上。我无法测试原因我没有适当的所有元素,但试试这个:

var counter = 0.8;
var diceNumber = 0;

var rollDice = function(diceId){
    var dfd = new $.Deferred();

    var roll = function() {
        $('#' + diceId).removeClass('idle');

        counter *= 1.2;

        diceNumber = Math.round(Math.random()*5) + 1;

        $('#' + diceId).removeClass();
        $('#' + diceId).addClass('dice_' + diceNumber);

        if(counter < 800) {
            timeout = setTimeout(roll, counter);
        }else{
            $('.winner').text(diceNumber);
            $('#' + diceId).removeClass();
            $('#' + diceId).addClass('animate');
            $('#' + diceId).addClass('dice_' + diceNumber)
            .animate({ zoom: '1.3' }, 200)
            .animate({ zoom: '1' }, 100);

            dfd.resolve();
        } 
    }

    roll();

    return dfd.promise();
}


var startToDice = function() {
    rollDice('dice_1').then(function(){
         rollDice('dice_2');
    });
}

startToDice();

如果您在运行时遇到任何错误,请告诉我,以便我可以根据需要进行调整。

答案 1 :(得分:1)

像bergi一样:

var startToDice = function() {
    rollDice('dice_1').then(function() { rollDice('dice_2'); });
}