我有一个主要使用jQuery和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_feet
动画完成后调用move_head
。但是,对于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)
。但是,如何让它延迟执行代码直到适当的时间?
答案 0 :(得分:3)
当您编写move_feet(x, y)
时,是的,即调用函数move_feet
- 就像在普通的JavaScript中一样。如果你只是写move_feet
,那就不叫它;它只是对函数的引用。你想要的是这个:
complete: => @move_feet(x, y)
答案 1 :(得分: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()
。