Преждевременное выполнение кода с CoffeeScript - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть анимация, которая в основном работает с 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 ]

3 голосов
/ 22 февраля 2012

Когда вы пишете move_feet(x, y), да, это вызывает функцию move_feet - как в обычном JavaScript.Если вы просто напишите move_feet, это не называется;это просто ссылка на функцию.Вместо этого вы хотите:

complete: => @move_feet(x, y)
2 голосов
/ 22 февраля 2012

Просто создайте еще одну анонимную функцию:

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) будет эффективно делать later() за 1000 мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...