2011-08-31 5 views
1

좋아, 나는 분명히 분명한 뭔가를 놓치고있다. 비슷한 예제를 찾으려고했지만, 내가하고 싶은 것을 꽤 찾지 못한다. 특정 순서로 실행하려면 일련의 아약스 호출이 필요합니다. 나는 거래를 완료하려면 다음 코드를 사용하고 있습니다 :jQuery 지연 연쇄 문제

지금은 시도되는 .done, 그 때는, 그냥 .anything에 대해()하지만 한
showStandbyDialog(); 
    $.when(function(){console.log('Paying Charges due before transaction');}) 
     .always(this.applyCredit(parseFloat($(this.currentChargesTarget).html()))) // Pay charges due before transaction 
     .always(function(){console.log('Applying renewals');}) 
     .always(this.applyRenewals()) // Apply Renewals 
     .always(function(){console.log('Paying renewal charges');}) 
     .always(this.applyCredit(this.renewCart.length * this.renewCost)) // Pay renewal charges 
     .always(function(){console.log('Applying checkouts');}) 
     .always(this.applyCheckOut()) // Apply checkouts 
     .always(function(){console.log('Paying checkout charges');}) 
     .always(this.applyCredit(this.cart.length * this.checkOutCost)) // Pay checkout charges 
     .always(function(){console.log('Applying card replacement');}) 
     .always(this.applyCardReplacement()) // Apply card replacement 
     .always(function(){console.log('Paying leftover charges');}) 
     .always(this.applyCredit(this.cardCost)) // Pay leftover charges 
     .always(function(){console.log('Finalizing Transaction');}) 
     .always(function(){ updateCharges(); bfwd.Patron.Transaction.reset(); hideStandbyDialog(); }); // Reset Transaction and clear standby dialog 

의 핸들 함수에서을 console.log() 코드 this.applyCredit() 항상 console.log ('트랜잭션 완료') 다음에 기록됩니다. 모든 this.function() 호출은 궁금한 점을 대비하여 jquery 지연 메소드를 리턴합니다.

내가 완전히 여기 내 jsFiddle 다시 만들어
+2

비동기라고 부르는 함수가 있습니까? 그렇지 않은 경우 지연을 사용할 이유가 없습니다. 직접적인 절차 프로그래밍에서 적절한 순서로 이러한 모든 다른 함수를 호출하는 함수를 작성하면됩니다. 비동기식이면 비동기식 API를 사용하여 지연된 API를 적절하게 사용하는지 여부를 평가할 수 있습니다. – jfriend00

+0

그는 일련의 아약스 전화로 내가 방금 가정했기 때문에 ... –

+0

죄송합니다.이 댓글을 확인하지 못했습니다. 나는 코드를 게시하는 데 아무런 해가 없다고 생각한다. 1 초. – LordZardeck

답변

8

:에 http://jsfiddle.net/JohnMunsch/nxPn3/

약 10 배 :

.always()를 같은 이연 객체를 반환 된 (또는 약속) 첫 .when에 완료했다() 모든 다른 .always() 함수. 그래서 그들은 급속한 승계 속에서 떠났습니다. 그것은 대략 이와 비슷하게 보입니다.

Step 1: log. 
Step 2: kick off ajax call, log, kick off ajax call, log, kick off ajax call, log, etc. etc. 

내가 그들을 잠시 지연하기 위해 내 "아약스 호출"각각의 기능에 타이머를 넣어 때까지 난 정말 그것을보고하지 않았다. 그렇다면 문제가 계속 발생했습니다. 이전 단계의 .done() 함수에서 각 다음 단계를 중첩하지 않고 어떻게해야합니까?

저의 해결책은 가장 우아하지 않을 수도 있지만 효과가있었습니다. Deferred 오브젝트의 완전한 세트를 앞쪽으로 만들었고 이전 단계가 해결되거나 거부 될 때까지 각 연속 단계가 시작되는 것을 방지하기 위해이 오브젝트를 사용합니다.

여기에 그에서 발췌입니다 :

console.log('Paying Charges due before transaction'); 
var step1 = applyCredit("parseFloat($(this.currentChargesTarget).html())"); 
var step2 = new $.Deferred(); 
var step3 = new $.Deferred(); 

$.when(step1).done(function(){ 
    console.log('Applying renewals'); 
    $.when(applyRenewals()).done(function() { 
     step2.resolve(); 
    }); 
}).fail(function() { step2.reject() }); 

$.when(step2).done(function(){ 
    console.log('Paying renewal charges'); 
    $.when(applyCredit("some subcalc")).done(function() { 
     step3.resolve(); 
    }); 
}).fail(function() { step3.reject() }); 

을 이제 jsFiddle, 완벽한 행에 따라 각 함수 호출 행진을 실행할 때. 첫 번째 작업이 완료 될 때까지 두 번째 작업이 시작되지 않고 두 번째 작업이 완료 될 때까지 세 번째 작업을 시작할 수 없습니다.

+0

글쎄, 내가 확인하고 모든 .then 및 .done 함수와 모든 개체를 반환합니다. 정확히 말하자면 다음과 같이 반환합니다. jQuery.post() – LordZardeck

+1

감사합니다. 그것은 완벽하게 작동했습니다. 동기화 작업이 필요한 내 프로그램에는 많은 것들이 있으므로 내 지식 기반에이를 유지할 것입니다. – LordZardeck

4

OK, 원래 요청한 작업을 수행하는 방법에 대한 첫 번째 대답을 알아 냈습니다. 대답. 하지 마.

클라이언트를 사용하여 서버에서 8 단계 재무 프로세스를 순서대로 지정하지 마십시오. 젠장, 서버에서 2 단계 재무 프로세스를 시퀀싱하는 데 사용하지 마십시오. 서버가 다운되거나 사용자가 노트북을 닫거나 인터넷 연결이 끊어지면 어떻게됩니까? 아마 1 ~ 3 단계 또는 1 ~ 5 단계를 단위로 실행해야하는 순서로 끝난 것입니다.

ONE AJAX를 서버에 호출하고 8 단계를 수행하는 데 필요한 정보를 제공하십시오. 서버에서 가능한 경우 서버에서 지원하는 트랜잭션을 사용하거나 데이터베이스 트랜잭션을 사용하여 모든 작업이 함께 성공하거나 모두 실패하고 모든 오류가 발생하면 모든 것이 원래 상태로 롤백됩니다. 그런 다음 각 단계에 대한 세부 정보를 포함하여 필요하거나 원할 경우 고객에게 결과를 포함하여 발생한 결과를보고 할 수 있습니다.

+1

한 번에 하나씩해야하는 이유는 각 작업마다 오류가 발생할 수 있기 때문입니다. 그리고 각 작업은 다음 작업을 계속 진행하기 전에 실패 여부를 확인해야합니다 (아직 구현되지 않았습니다). 하나가 실패하면 프로세스를 중지하고 사용자에게 경고하며 나머지 데이터는 그대로 남겨두고 사용자가 진행 상황을 잃지 않도록합니다. – LordZardeck

+0

또한 서버를 작성하여 서버가 처리하도록 작성하는 방법을 발견 할 수 있음을 이해합니다. 그러면 서버가 다시 작성되므로 프로젝트가 지금 당장 걱정할 필요가 없습니다. 그리고 나는 모든 것을 먼저 작동시키는 것에 더 관심이 있습니다. 그러나 당신은 요점이 있고 옳습니다. 서버는 모든 데이터와 로직을 처리해야하며 클라이언트는 해당 정보를 표시합니다. 내가 대답 할 수 있으면 좋겠어. – LordZardeck