如何在递归方法完成后链接方法调用以立即执行?

时间:2012-01-10 20:05:32

标签: jquery coffeescript

我需要一些帮助,方案如下:我有一个Coffeescript类的递归方法,它正好执行4次。我需要在完成4次迭代后立即从同一个类中调用另一个方法,让我说明一下,

class Table
  constructor: (factor, zindex) ->
    @factor = factor
    @zindex = zindex
    @dealt = false
    @player = new Player 'player'
    @house = new Player 'house'
    this.setDealing()

  setDealing: ->
    self = this
    $('#deal').click ->
      self.deal $('.one-card:last'), 0 if self.amount > 0 && not self.dealt
      #When the call to self.deal() above is done I need to call checkWinner()
      #How Can I do this?

  deal: (card, times) ->
    $('#player-hand, #house-hand, #ask, #stop').show()
    @dealt = true
    self = this
    if (card.prev() || card.first()) && times < 4
      cardValue = this.getCardValue card
      if @zindex % 2 == 0 then @house.push cardValue else @player.push cardValue
      top = cardPlace + @factor
      right = 550 - (@factor * 1.4)
      card.animate
        'top': "+=#{top}"
        'right': "+=#{right}"
        350, ->
          card = card.prev()
          #Recursive Call is done Here!
          self.deal card, times + 1     
    @factor += 10
    @zindex += 1

  checkWinner: ->
    @player.isWinner()

正如您所看到的,递归方法非常复杂(或者不是......),并且它需要一些时间才能完成,因为它会执行许多动画(每次迭代一次)。 我不知道如何在最终完成此递归方法后调用/链接另一个方法来执行。

我怎样才能做到这一点? 提前谢谢!

注意:我再添加一行代码,这些代码缺少card = card.prev(),这是递归递送所需要的。抱歉混淆(如果有的话)

3 个答案:

答案 0 :(得分:0)

我认为你应该跟踪这个功能的执行情况;我的意思是保留一个公共变量

  var isRunning=false;

在函数的开头放了这个:

  isRunning=true;

当递归完成时:

  isRunning=false;

答案 1 :(得分:0)

如果我理解这一点:

交易是递归函数。如果满足某个条件,它会调用一次交易。一旦不再满足该条件,它应该继续沿着方法链。还有另一种可能的解释,你需要使用内部链而不是外部链。

现在,你的堆栈看起来像这样 交易 - &gt;交易 - &gt;交易 - &gt;处理

所以你可以通过两个简单的改变做你想做的事。在没有递归的情况下思考它总是有帮助的,然后答案就更容易了:

if (card.prev() || card.first()) && times < 4
  # <snip>
  #Recursive Call is done Here!
  return self.deal card, times + 1
else
  return self

现在你可以打电话了

$(selector).deal(arguments).show()

答案 2 :(得分:0)

好吧,我自己破解了这个......

我必须查看JQuery的queue()和dequeue()方法,使用它们我可以实际编排一系列要触发的事件,然后通过使用时间延迟来协调它们,整齐!

以下是现在的结果:

enableDealing: ->
    self = this
    $('#deal').bind 'click', ->
      self.disableHitting(); self.disableDealing()
      table = $('#table')

      table.queue "namedQueue", (next) ->
        self.deal $('.one-card:last'), 0
        next()

      table.delay 1900, "namedQueue"

      table.queue "namedQueue", (next) ->
        self.continue()

      table.dequeue('namedQueue')

这里的诀窍是延迟1900毫秒。这是完成交易所需的时间。

我希望其他人觉得它很有用!