2016-04-27 16 views
0

私はちょっとしたサイコロのゲームをやっています。 私がしていることは、サイコロのX回のスクラブルで、最終値に達するまでランダムな速度を遅くしていくことです。jQueryはsetTimeoutsを連鎖して約束します

しかし、私はダイス上でスクランブルを1ずつ実行したいと思います。私は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(); 

そして、何、それはやって終了すると同時に、両方のサイコロを実行しているが。

アドバイスはありますか?ありがとう。 bergiによってcomented

+1

あなたの 'else'ブランチだけが約束を返しますか? – Bergi

+1

その約束は常に同期的に解決されますか? – Bergi

+1

'then'はコールの結果ではなくコールバック関数を期待しています! – Bergi

答えて

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(); 

あなたはので、私は必要に応じて調整を行うことができ、それを実行するときに、すべてのエラーを取得する場合、私に教えてください。

+0

ニースのアプローチ。しかし、まだ動作しませんでした、理由を知らない、あなたがしたことが私に意味をなさないので。コンソールにはエラーはありません。 – msqar

+0

@msqarさて、どうなっていますか?私は 'Undefined'エラーの「プロパティを読み取ることができません」、もう一度「エラー」を取得していないと確信していますので、次のステップは何ですか? :) – aaronofleonard

+0

はい、私はもうエラーが出ません。なぜなら、atmはoutter関数(rollDice)から約束を返すからです。構造は今のところ良くなっていますが、2番目のダイスは転がり始めていません。あなたが理由を知っている? – msqar

1

同様:

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

助けてくれてありがとう。私の現在のコードで、もしそうすれば、それは事実です。私はコンソール上で 'プロパティを読み取ることができません'、次に '未定義'というエラーが表示されます。なぜなら、私はelse内で約束を返すだけだからです。機能の私の現在の構造が間違っているかもしれないように見えます。 – msqar

+0

Mmmm確かに、私は今すべてのパラメータを渡しています。 – msqar

関連する問題