2012-02-22 7 views
0

ほとんどの場合、jQueryとCoffeeScriptで動作するアニメーションがあります。CoffeeScriptでの早すぎるコードの実行

私はかなり分かりませんが、問題が発生しました。

class Cow 
    move_head: (x, y)=> 
    stander.animate({ 
left: 10, 
    },{ 
    complete: @move_feet(x, y) 
    }); 

    move_feet: (x, y)=> 
    stander.animate({ 
left: 10, 
    },{ 
    complete: @mover_in_test 
    }); 

問題はcomplete: @move_feet(x, y)です。引数がない場合はcomplete: @move_feetコードが正常に動作し、move_headのアニメーションが完了すると@move_feetが呼び出されます。しかし、complete: @move_feet(x, y)では、@move_feet(x, y)と呼ばれる瞬間と呼ばれるmove_head(x, y)が呼び出されます。

私はcomplete: this.move_feetcomplete: @move_feet場合にcomplete: this.move_feet(x, y)と にcomplete: @move_feet(x, y)場合に

である、のCoffeeScriptをコンパイルしたものに見えました。

したがって、私はコードを解析するとすぐにcomplete: this.move_feet(x, y)を呼び出していると思います。しかし、適切な時間までコードのこの実行を遅らせるにはどうすればよいですか?ここではサンプルのカップルです

complete: => @move_feet(x, y) 

答えて

2

はちょうど別の無名関数を作ります。まず、あなたの例のようなもの:

class Sample 
    constructor: (@x, @y) -> 

    do_later: => 
    later = => @do_alert(@x, @y) 
    setTimeout(later, 2000) 

    do_alert: (a, b) => 
    alert([a, b]) 

a = new Sample(33, 44) 
a.do_later() 

はもちろん、このためのクラスを必要としない:

later = -> alert("hello") 
setTimeout(later, 1000) 

注意をあなたがthisをしたい場合(例えば、クラス内)に保存されることを、あなたに=>を使用する必要があります。そうでない場合は->になります。基本的に、ここでlaterと呼ばれると呼ばれる無名関数であり、本体(alert("hello")の場合)を実行します。 setTimeout(later, 1000)は1000msで効果的にlater()を実行します。

3

move_feet(x, y)と書くと、通常のJavaScriptと同様に、move_feetという関数が呼び出されます。 move_feetと書いても、それは呼び出されません。それは単なる関数の参照です。代わりにあなたが望むのはこれです:

complete: => @move_feet(x, y) 
関連する問題