我需要一些帮助,方案如下:我有一个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(),这是递归递送所需要的。抱歉混淆(如果有的话)
答案 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毫秒。这是完成交易所需的时间。
我希望其他人觉得它很有用!