2011-08-31 9 views
1

私はおそらく何かが分かりません。同様の例を見つけようとしていますが、私がやりたいことと全く同じものを見つけることはできません。私は特定の順序で実行する一連のajax呼び出しが必要です。 、jQuery遅延チェーニングの問題

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 

は、今私は、の.doneを試してみました.then、そしてちょうど.anythingについて()が、ハンドルの機能ではconsole.log()コード:私は、トランザクションを確定するには、次のコードを使用していますthis.applyCredit()は常にconsole.log( 'トランザクションの終了')の後にログを記録します。あなたが不思議に思っていた場合に備えて、すべてのthis.function()コールはjqueryの遅延メソッドを返します。

私は完全にここに私のjsFiddleリメイク
+2

これらの関数のいずれかが非同期呼び出しと呼ばれていますか?そうでない場合は、延期を使用する理由はありません。ストレートプロシージャプログラミングで適切なシーケンスでこれらの他の関数をすべて呼び出す関数を作成するだけです。それらが非同期の場合は、コードを表示して、遅延APIを適切に使用しているかどうかを評価することができます。 – jfriend00

+0

彼はそれが一連​​のアヤックスコールだったと言っていたので、私はちょうど... –

+0

申し訳ありませんが、これらのコメントに気付かなかった。私はコードを投稿することは害ではないと思う。ちょっと待って。 – 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オブジェクトの完全なセットを作成し、前のステップが解決済みまたは拒否とマークされるまで、各連続ステップが開始されないようにします。あなたがjsFiddle、完璧な行中に沿った各関数呼び出しのデモ行進を実行すると

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() }); 

:ここ

はそれからの抜粋です。 2番目は最初の作業が終了するまで開始されず、3番目の作業は2番目の作業が完了するまで開始できません。

+0

よく、私はチェックし、すべての.thenと.done関数とすべてを持つオブジェクトを返しています。正確には、これを返す:jQuery.post() – LordZardeck

+1

大丈夫です。それは完璧に機能しました。私のプログラムには、同期して作業する必要のあるものがたくさんあるので、間違いなく私の知識ベースにこれを保持していきます。 – LordZardeck

4

OK、最初に尋ねたことを最初に尋ねたところ、回答。それをしないでください。

クライアントを使用してサーバー上で8段階の財務プロセスを順序付けしないでください。ヘックは、サーバー上で2つのステップの財務プロセスを順序付けるためにそれを使用しないでください。サーバーがダウンしたり、ユーザーがラップトップを閉じたり、インターネット接続を失ったりするとどうなりますか?あなたはたぶんステップ1〜3が完了した、または1〜5がユニットとして実行されたシーケンスから終わったことになります。

を作成してください。ONE AJAXがサーバーに電話し、8つの手順すべてを実行するために必要な情報を入力します。可能であれば、サーバーでサポートされているトランザクションを使用するか、データベーストランザクションを使用してすべての操作が一緒に成功するか、すべて失敗した場合はすべてが元の状態にロールバックされます。その後、必要に応じて、または必要に応じて各ステップの詳細を含めて、クライアントに返された結果を報告することができます。

+1

私は一度に1つずつやり直さなければならない理由は、それぞれのアクションが失敗するということです。そして、それぞれのアクションは、次の作業を続けることを許可する前に失敗をチェックすることになっています。いずれかが失敗すると、プロセスを停止し、ユーザーにアラートを出し、残りのデータはそのまま残して、ユーザーの進捗状況を失わないようにします。 – LordZardeck

+0

私は、サーバーがすべての世話をするように書き込む方法を見つけることができたと理解しています。私はおそらくそれを書き直します。私はそれをすべて最初に働かせることにもっと興味があります。しかし、あなたはポイントがあり、正しいです。サーバーはすべてのデータとロジックを処理する必要があり、クライアントはその情報を表示するだけです。私は答えとして両方をマークすることを願っています。 – LordZardeck