2011-09-14 5 views
0

私はjQuery 1.5.2を使用しており、Ajaxリクエストに複数の成功コールバックを登録しています。最初の成功コールバックでは、応答に必要なすべてのデータが含まれているかどうかを確認し、そうでない場合はすべての後続成功コールバックをキャンセルする必要があります。jQuery ajax成功ハンドラから後続の成功コールバックをすべてキャンセルするにはどうすればよいですか?

注:私は、サーバーから送信されたヘッダにアクセスすることはできません。常に200 Successを送信します。

セカンド注:私はちょうど2つのコールバックを組み合わせることはできません。これは、コード内の異なる場所にコールバックを登録するより大きなシステムで問題が発生した場合の簡単な例です。

後続の成功コールバックをキャンセルするにはどうすればよいですか?

var request = $.ajax({ 
    url: '/echo/json' 
}); 

// First success handler 
request.done(function(data, textStatus, jqXHR) { 
    console.log('first', jqXHR); 
    if ($.isEmptyObject(data)) { 
     // I want to cancel the second success handler here! 

    } 
}); 

// Second success handler 
request.done(function(data, textStatus, jqXHR) { 
    console.log('second', jqXHR); 
}); 

ありがとう:

いくつかのサンプルコードは、この(jsfiddle)のように見えます!

+0

私はjQueryコードを見ていますが、実際にこれを行う方法はありません。彼らはなぜ2つの呼び出しに分割されますか? – Andrew

+1

ここに複数のコールバックがあるのは何ですか?なぜ関数を最初のコールバックメソッド自体に統合するだけではないのですか? – arviman

+1

これは、複数のコールバックを持つより複雑なシステムの簡単な例です。 –

答えて

0

あなたが最初にすべきことは、状態変数(または 'フラグ')をチェックしています現在の状況を考慮して、実行可能かどうかを関数に通知します。

コールバックをもう実行したくないですか?フラグをある値に設定し、実行時にそのフラグがその特定の値を持つ場合、コールバック関数をただちに返すようにします。

また、XXコールバックだけを実行してもかまいません。それ以上は実行しないでください。

このようなシステムを設定すると、複数の非同期コールバックを持つ大規模なWebアプリケーションの動作を1か所から制御できるため、多くの柔軟性とオプションが得られます。

これを支援するために、ディスパッチャとして機能する機能を持つことができます。この関数は、コールバックの動作を変更するたびに、コールバック関数として使用されます。パラメータとしてコールするために通常のコールバック関数を渡すと、ディスパッチャは通常のコールバックを続行するかどうかを決定する前に正しい条件をチェックします。

このようにして、コールバック関数の内部で条件をチェックする必要はありません。実際に多くのコールバックを持つ大規模なアプリケーションに特に役立ちます。

+1

あなたはより多くの情報を提供するための答えを得ています。ありがとう! –

0

そのままマージします。

// Success handler 
request.done(function(data, textStatus, jqXHR) { 
    console.log('first', jqXHR); 
    if ($.isEmptyObject(data)) { 
     return; 
    } 
    else { 
     console.log('second', jqXHR); 
    } 
}); 

またはこのお試しください:フィドル

var request = $.ajax({ 
    url: '/echo/json' 
}); 
second = true; 
// First success handler 
request.done(function(data, textStatus, jqXHR) { 
    console.log('first', jqXHR); 
    if ($.isEmptyObject(data)) { 
     second = false; 
    } 
}); 

// Second success handler 
request.done(function(data, textStatus, jqXHR) { 
    if(second) 
     console.log('second', jqXHR); 
}); 

を:あなたのコールバック関数でhttp://jsfiddle.net/maniator/zGvPW/3/

+0

"試してみてください"という解決策を行ったが、フラグをjqXHRオブジェクトに追加した。最初の成功ハンドラでは 'jqXHR.failed = true'を使用し、2回目は' if(!jqXHR.failed) '(http://jsfiddle.net/zGvPW/4/) –

+0

EricFreese ...通常はu **あなたに答えを与えた**という答えを選んでください。これは実際に助けられました - 将来のユーザーのために。 – Neal

関連する問題