2012-02-22 61 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)時刻。

我看對的CoffeeScript編譯了什麼,這是

complete: @move_feet(x, y)情況下

complete: this.move_feet(x, y)和 在complete: @move_feet情況下complete: this.move_feet

因此,我認爲它解析代碼後立即調用complete: this.move_feet(x, y)。但是,如何在適當的時候推遲代碼的執行?

回答

2

就再拍匿名函數:

complete: => @move_feet(x, y) 

這裏有幾個樣品。首先,像那樣的例子:

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)將在1000毫秒內有效地執行later()

3

當你編寫move_feet(x, y),是的,那就是調用函數move_feet - 就像在普通的JavaScript中一樣。如果你只寫move_feet,那不會叫它;它只是對這個函數的引用。你想要的是:

complete: => @move_feet(x, y)