2012-01-10 6 views
0

몇 가지 도움이 필요합니다. 시나리오는 다음과 같습니다. 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

를 호출 할 수 있습니다

내가 할 수있는 것들을 사용하여 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 밀리 초 지연이다. 거래를 끝내는 데 걸리는 시간은 어느 것입니까?

다른 사람들이 유용하다고 생각합니다.

0

나는이 함수 실행을 추적해야한다고 생각합니다. 나는 넣어 함수의 시작 부분에 공용 변수

var isRunning=false; 

을 유지 평균이 :

isRunning=true; 

및 재귀가 완료되면 :

isRunning=false; 
+0

재귀를 추적하는 것이 까다로울 것이라고 생각합니다. 특히 모든 반복마다 애니메이션이 수행되는 경우가 그렇습니다.어쨌든, isRunning 변수를 어디에 두어야할지 내 문제는 알지 못합니다. – jlstr

+0

mmmm 사실 그것은 까다 롭습니다. 그러나 문제를 해결할 것입니다.이 경우 isRunning 변수는 생성자에서 설정 될 수 있습니다. –

0

나는이 바로 이해한다면 :

거래가 재귀 함수입니다. 특정 조건이 충족되면 거래를 한 번 호출합니다. 일단 해당 조건이 더 이상 충족되지 않으면 메소드 체인을 계속 따라 가야합니다. 외부 체인이 아닌 내부 체인으로 작업해야하는 다른 가능한 해석이 있습니다.

는 지금, 당신의 스택이 거래처럼 보인다 -> 거래 -> 거래 -> 거래

그래서 당신은 당신이 두 가지 간단한 변화를 원하는 것을 할 수 있습니다. 항상 재귀없이 생각하는 데 도움이, 다음 대답은 쉽게 ... 나 자신이 하나의 금,

이제
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() 
+0

답변을 분석하고 있지만, 필자에게 의견을 제시하기 전에 포함해야한다고 말해야합니다 누락 된 선. 피터님께 감사드립니다. – jlstr

+0

저는 자바 스크립트 이벤트 버블 링과 같은 방식으로 호출 스택을 생각합니다. 위아래로 이동해야합니다. 스레드는 모든 함수를 열고 동일한 경로를 따라 되돌아 와야합니다. 물론,이 작업을 수행하는 또 다른 방법이있을 수 있습니다 (내가 무엇을하고 있는지 알지 못하더라도). 루프에서 0-4 회 조건부로 호출되는 비 재귀 함수를 가질 수 있습니다. 어쨌든 다른 기능이 좋을 수도 있습니다. 쇼 4 번을 정말로 불러야합니까? –

+0

사실, 재귀 대신 루프를 사용하는 것은 환상적인 제안입니다. 나는 그것에 대해 이전에 생각했지만 재귀를 사용하는 현재의 '아름다움'을 손상시키고 싶지 않았습니다. 어쨌든, 메서드 호출을 연결하는 문제를 해결하지 못했지만, 아약스 호출에 대한 연기 된 개체 (jQuery 호출을 사용 해본 적이 있습니까?) 또는 jQuery 큐 (예 : 작동 원리) 다시 한 번 감사드립니다. – jlstr

관련 문제