2011-10-27 29 views
1

尽管我在搜索时发现了很多匹配我没有找到合适的解决方案我的问题: 在我的脚本中,我有很多AJAX请求。在很多要求我执行重要codesnippets内如何调用全局函数ajaxSuccess() - 错误处理http-header

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

现在我需要为了处理错误serverside每成功验证特殊http-response-header。我认为在每个请求中调用一个函数handleHeaderFieldXYZ()将不会很优雅。我怎么能定义一个全局处理程序,如(ajaxSuccess,它只能被$(elem)调用)?如果我在Ajax-Setup中定义了成功,我将在调用已定义的本地成功时覆盖它。

回答

0

这里是),另一篇文章可以是一个简单的方法,你的问题......

Override Ajax Success event

然后,您可以在该函数内部的handlerHeaderFieldXYZ(后添加当前事件 如你所提到的

+0

嘿,感谢您的链接,但我真的不明白进入它: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进行访问,否则您可以将其传递给您,以便您可以进行评估。

以下是JavaScript逻辑做出的AJAX包装呼叫:

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包装:

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

没问题。我希望它整理你的问题。 –