2011-10-27 9 views
1

私は検索の際に多くのマッチを見つけましたが、私は本当に適切な解決策を見つけませんでした。私の問題は 私のスクリプトではAJAX- 。多くのリクエストで、私は今、私はすべての成功を収めてserversideエラーを処理するために、特別なhttp-response-headerを検証する必要がグローバルAJAXSuccess()の関数を呼び出す方法 - エラーハンドリングhttp-header

$ajax{.. success: //code here.. }. 

内の重要なcodesnippetsを実行します。すべてのリクエストでhandleHeaderFieldXYZ()という関数を呼び出すのは非常にエレガントではないと思います。どのようにグローバルハンドラ(ajaxSuccess、$(elem)の呼び出し可能)を定義することができますか?私がAjax-Setupで成功を定義した場合は、定義されたローカル成功を呼び出すときに上書きします。ここで

答えて

0

は、あなたが上記したようにあなたは、その関数内handlerHeaderFieldXYZ() 後に現在のイベントを追加することができます

Override Ajax Success event

...あなたの問題への単純なアプローチかもしれない別のポストであります

+0

リンクのためのおかげで、私は実際に取得しない:

AJAXHandler.MakeServiceRequest("POST", serviceUrl, method, queryString, jsonFilterArgument) .done(function (requestResult) { // Handle Request Success if (requestResult.Data.Quote) { var quote = requestResult.Data.Quote; // handle quote } else { // handle no quote found } return this; }) .fail(function() { // handle Request Failure return this; }); 

後は、AJAXラッパーですSomenoneが$ .ajaxSuccess(function(){// code})を試してみた。私も試したが、それは動作しません! Firebugは、それが関数ではないことを私に伝えています.-($の代わりにjQueryも使用しています)何らかの理由がありますか? –

+0

もしそれが '$ .fn.ajaxSuccess = function(){... $ .fn。ajaxSuccess(); } '考えられていませんが、試してみる価値があるのですか? – Val

+0

私はこれを発見したと言うことはできません:Ajaxの設定http://api.jquery.com/jQuery.ajax/ global:false!だから私はグローバルなハンドラを持っています。ローカルのハンドラで呼びたくないときは、グローバルに設定します:ローカルのハンドラをfalseにしました。 –

1

私はjQuery AJAX要求/応答メカニズムをラップし、遅延オブジェクトを実装しました。

要求が行われたときに私はと呼ばれる機能を操作できます。

  • はの.done:成功ハンドラを要求
  • .fail:障害ハンドラーを要求

ように私はこれをしませんでした特定のリクエストエラーのための汎用ハンドラを実装し、AJAXリクエストを作成して、レスポンスをより簡単に処理する機能を提供することができます。

私はコードでもう少し作業する必要がありますが、基本的な原則は、標準化された結果が維持されている限り、AJAXの実装を別の実装で削除できることです。つまり、別の開発者が独自のAJAX実装を実装するためにラッパーを使用することができ、システム全体のすべてのロジックが引き続き動作するはずです。

問題が正しく理解されている場合、このコードはシナリオに役立ちます。これはまだ完璧ではないし、あなたはそれを改善することができると確信しているが、私はそれが助けてくれることを願っている

私が考えることができるのは、AJAXリクエストオブジェクトがヘッダーで動作することだけです。私はそれが.done/.failでアクセス可能だと思う。そうでなければ、評価をすることができる。続き

は、AJAXラッパーへの呼び出しを行うために、JavaScriptのロジックです:ねえ、

var jqueryAJAXHandler = function ($) { 

    // private 
    function ResponseHandler(data) { 
     var dfd = $.Deferred(); 
     var obj; 

     if (data.d) { 
      obj = JSON.parse(data.d, JSON.IsoDateReviver); // we use iso standard for date transmission hence the isoDateReviver. 
     } else { 
      obj = JSON.parse(data, JSON.IsoDateReviver); // we use iso standard for date transmission hence the isoDateReviver. 
     } 

     if (obj === null || obj.RequestStatus === null) { 
      // Every request made must respond with a requestStatus object as per standards. 
      // If obj is null it means that requestStatus was not added to the response OR 
      // an error occurred while chatting to the other server. 
      var failResult = { 
       RequestStatus: { 
        Status: 'error', 
        Type: 'malformedResponse', 
        Message: 'No Request Status object returned.' 
       } 
      }; 

      dfd.reject(failResult); 
      return dfd.promise(); 
     } 
     else if (obj.RequestStatus.Status === "error") { 
      // Everything is in order up to this point. 
      // we are now looking at a well formed response. 
      // we just do not know if the request for processing 
      // was successful. 
      // We now look at the requestStatus object to figure 
      // out if we were successful in proceessing. 

      // ACCESS RIGHTS or INVALID SESSION error handler 
      if (obj.RequestStatus.Type === "invalidSession") { 
       dfd.reject(null); // close off current deferred object. 
       return HelpejqueryAJAXHandlerr.GenericInvalidSessionHandler(obj); // return different promise. 
      } 
      else if (obj.RequestStatus.Type === "noAccess") { 
       dfd.reject(null); // close off current deferred object. 
       return jqueryAJAXHandler.GenericNoAccessHandler(obj); // return different promise. 
      } 

      dfd.reject(obj); 
      return dfd.promise(); // all other errors are handled by custom error handlers. 
     } 

     dfd.resolve(obj); 
     return dfd.promise(); 
    } 

    // public 
    return { 
     GenericInvalidSessionHandler: function() { 
      window.location.href = obj.RequestStatus.Url; 
      return null; 
     }, 
     GenericNoAccessHandler: function (obj) { 
      var dfd = $.Deferred(); 
      // TODO : Implement generic no access rights error handler 
      // must work accross any page. 
      dfd.reject(obj); 
      return dfd.promise(); 
     }, 
     GenericErrorHandler: function (obj) { 
      var dfd = $.Deferred(); 
      alert("An error occurred while processing your request. Please try again. If this issue continues please inform your manager."); 
      dfd.reject(obj); 
      return dfd.promise(); 
     }, 

     MakeServiceRequest: function (requestType, serviceURL, methodName, queryString, objData) { 
      var dfd = $.Deferred(); 

      //#region MakeServiceRequest 

      // ORGANISE THE ARGUMENTS FOR THE REQUEST. 
      // ensure the session id always goes through. 
      var args = ""; 
      var blnProcessData = false; 
      // convert arguments into JSON string for $.ajax request. 
      // arguments come after the 4 reqd parameters 

      //args = 
      // PROCESS URL 
      // put href into loc var for easy reading. 
      var loc = serviceURL + "/" + methodName; 
      if (queryString != "") { 
       loc = loc + "?" + queryString; //window.location.href; 
      } 

      // CALL WEB METHOD 
      $.ajax({ 
       cache: false, 
       async: true, 
       type: requestType, 
       url: loc, 
       data: objData, 
       processData: blnProcessData, 
       contentType: "application/json;charset=utf-8", 
       dataType: "json" 
      }) 
       .success(function (data, textStatus, jqXHR) { 
        ResponseHandler(data) 
         .done(function (obj) { 
          dfd.resolve(obj); 
         }) 
         .fail(function (obj) { 
          dfd.reject(obj); 
         }); 
       }) 
       .error(function (jqXHR, textStatus, errorThrown) { 
        // XMLHttpRequest Failed. 
        var failResult = { 
         RequestStatus: { 
          Status: 'error', 
          Type: textStatus, 
          Message: errorThrown 
         } 
        }; 
        dfd.reject(failResult); 
       }); 

      return dfd.promise(); 
      //#endregion MakeServiceRequest 
     } 
    } 
};   // jqueryAJAXHandler 
+0

うわー、この詳細な回答をありがとう!私は間違いなくそれを将来採用する予定です。 –

+0

問題ありません。私はそれがあなたの問題を分類することを願っています。 –

関連する問題