2012-01-16 11 views
8

実際には、問題はトピックと同じくらい簡単です。別のAjaxハンドラに高い/低い優先度を与える方法はありますか(これは早い段階で発火することを意味します)。jQuery - Ajaxハンドラの優先度を設定する

どういう意味ですか?まあ、私はかなり巨大なWebアプリケーションに対処する必要があります。多数のAjaxリクエストが異なるモジュールで起動されます。今、私の目標は、単純なセッションタイムアウトメカニズムを実装することです。各リクエストは現在のsession-idをパラメータとして送信し、session-idがそれ以上有効でない場合、私のバックエンドスクリプトはリクエストレスポンスヘッダセット(値はURI)を返します。

だから私は基本的にこれは当然の魅力のように機能しますが、私の問題は、この世界的なAjaxのイベントは、実際に解雇する時の最初の100%を必要としていることで、それはこの

window.jQuery && jQuery(document).ajaxComplete(function(event, xhr, settings) { 
    var redirectto = xhr.getResponseHeader('new_ajax_location'); 
    if(redirectto) { 
     location.href = redirectto; 
    } 
}); 

のようなつもりですそうではありません。元のajax-requestハンドラの中には、欠落したデータや予期しないデータのためにエラーが発生するものがあります。その場合、グローバルハンドラは決して実行されません。

すべての単一のリクエストハンドラを通過して、無効なセッションデータレスポンスのフェイルセーフを行う必要がなければ、ちょっとうれしいでしょう。私ははるかに特定の場所で仕事をすることを好むだろう。しかし、グローバルハンドラが最初に実行されることをどうすれば確認できますか?

+0

おそらく 'onSuccess'コールバックを使用します。 – Stefan

+0

@Stefan:リクエストにはすべての可能な結果を​​キャッチする必要があるので、 'complete'は大丈夫です。しかし、残念なことに同じような振る舞いで、手動で「成功」と「エラー」を設定することも確認しました。 – jAndy

+0

http://stackoverflow.com/questions/290254/how-to-order-events-bound-with-jqueryに関連するため、AJAXイベントはコアイベントシステムを使用して実装されるため、 –

答えて

1

私が正しく理解している場合は、どこにでもjsonリクエストに独自のコールバックを追加したいと考えています。 ajaxPrefilterフックを使用することができます。

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
     options.complete = function (jqXHR2, settings) { 
      var redirectto = jqXHR2.getResponseHeader('new_ajax_location'); 
      if(redirectto) { 
       location.href = redirectto; 
      } 
     } 
    }); 

また、リクエストパラメータにセッションIDを追加するためにそこにオプションを変更することができます。

0

jQueryでは、.post/.ajaxなどのメソッドに「パッチを当てる」ことができます。

特殊なAJAXイベントが常に呼び出される前に起動されるように、適切なメソッドにパッチを当てることができます。

これは、開始に役立つ「疑似jQueryコード」です。私はそれがそのまま動作するとは思えませんが、それは基本的なコンセプトを示し、それはあなたを始めなければなりません。

(function($){ 
    var originalPost = $.post; 
    var calledSpecialOne = false; 
    $.post = function(url, data, success, dataType) { 
     if (!calledSpecialOne) { 
      originalPost(... your special AJAX query ...).then(function() { 
      originalPost(url, data, success, dataType); 
      } 
      calledSpecialOne = true; 
     } else { 
      originalPost(url, data, success, dataType); 
     } 
    } 
})(jQuery); 

上記のいくつかの他、関係のない、コードに基づいており、私は未定義/ nullの配列のために働く)($ .eachを行っている、をテストしてい):多くが露出していること

(function($){ 
    var originalEach = $.each; 
    $.each = function(collection, callback) { 
     return collection? originalEach(collection, callback) : []; 
    } 
})(jQuery); 

注意関数もjQueryによって内部的に呼び出されるので、このトリックを使用して非常に注意してください。 jQueryの別の部分を壊したり、他の問題を引き起こす可能性があります。 AJAX関数の場合、無限再帰を防ぐために、最も内側の関数のみをパッチする必要があります。 (FWIW、これまで$ .each()パッチの副作用が見つかりませんでした)。

+0

私はアヒルのパンチングの原理が好きでも、私はこの特定の状況では好きではありません。私は利用可能なすべてのAjaxルーチンにパッチを当てるか、単に '.ajax()'をパッチしなければならないでしょうが、これもまた私は実際にはあえてしません。しかし、私は公式にコールオーダーを修正する公式の可能性がない場合は選択肢がないかもしれません。 – jAndy

0

これはあなたが意味するものなのかどうかは分かりませんが、とにかくそれをある点として必要と思っていました。

これは、プロパティがpriorityのオブジェクトを受け入れるためにjQueryのajax関数をパッチします。優先順位セットがない場合、その優先順位は1(最高優先順位0)になります。優先順位がある場合は、2つのうちの1つを行います。優先順位が5のようなものであれば、それは前の優先順位(この場合は4)のajax呼び出しが呼び出されたかどうかをチェックします。そうでなければ、その優先順位(この場合は5)を持つajax呼び出しの配列に追加します。以前の優先度が呼び出されている場合、その要求は正常に呼び出されます。優先度付きで要求が呼び出されると、次に優先度の高い送信要求が呼び出されます。

つまり、プライオリティがない場合は、プライオリティ0を待機し、プライオリティがある場合は、そのプライオリティが呼び出されるのを待ちます。あなたはすぐに送信すべき優先度の高い通話をしたい場合は、コメント行をコメントアウト私はgetpostためdefault action?

(function($){ 
     var oldAjax=$.ajax; 
     var outgoing=[]; 
     var sent=[]; 
     $.ajax=function(url, settings) { 
      var pr = (typeof url==='object'?url:settings).priority; 
      pr = pr===undefined ? 1 : pr; // default action? 
      if(pr!==undefined){ 
       if(pr==0 || sent[pr-1]!==undefined){ 
        oldAjax(url,settings); 
        sent[pr]=true; 
        if(outgoing[pr]){ 
         var rq=outgoing[pr].splice(0,1)[0]; 
         $.ajax(rq[0],rq[1]); 
        } 
        if(outgoing[pr+1]){ 
         var rq=outgoing[pr+1].splice(0,1)[0]; 
         $.ajax(rq[0],rq[1]); 
        } 
       } 
       else{ 
        if(outgoing[pr]!==undefined){ 
         outgoing[pr].push([url,settings]); 
        } 
        else{ 
         outgoing[pr]=[[url,settings]]; 
        } 
       } 
      } 
      else{ 
       oldAjax(url, settings); 
      } 
     }; 
    })(jQuery); 

パッチを言って置きます。これらの余分な引数を含めるか、またはこれを自分で変更して、postgetの要求を優先して処理する必要があります。これは、追加の引数を除いて、jQuery 1.7からまっすぐであり、コメントを追加した2行です。例えば、ここに

jQuery.each([ "get", "post" ], function(i, method) { 
    jQuery[ method ] = function(url, data, callback, type, priority) { 
     // shift arguments if data argument was omitted 
     if (jQuery.isFunction(data)) { 
      priority = type; // my change 
      type = type || callback; 
      callback = data; 
      data = undefined; 
     } 

     return jQuery.ajax({ 
      type: method, 
      url: url, 
      data: data, 
      success: callback, 
      dataType: type, 
      priority: priority // my change 
     }); 
    }; 
}); 

Iセットアップ:http://jsfiddle.net/tk39z/

私は実際にあなたが要求を確認するためにChromeでネットワークパネルを確認することができますので、グーグルをターゲットに、いくつかのAJAX要求を作成しました。

0

私は最近、あなたが探していると思う機能に非常によく似た何かを実装しました。

有効なセッションをテストするためにサーバー側にフィルタを設定し、そうでなければ、より詳細なエラーの詳細についてはカスタムステータステキストで401エラーを返します。

これらのページに行ったajax呼び出しは、「success」属性を使用して通常の規約で記述されています。

エラーが発生した場合は、特定のエラーをテストしてそれに応じてリダイレクトするエラー関数にグローバルコールバックを追加しました。

$(document).ajaxError(function(e, xhr) { 
    var redirectto = xhr.getResponseHeader('new_ajax_location'); 
    if(redirectto) { 
     location.href = redirectto; 
    } 
});