使用CoffeeScript执行过早的代码

时间:2012-02-22 01:13:51

标签: jquery coffeescript javascript

我有一个主要使用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)。但是,如何让它延迟执行代码直到适当的时间?

2 个答案:

答案 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()