2012-03-22 52 views
4

我想創建一個全局處理程序,它在ajax成功回調之前被調用。我用我的應用程序做了很多ajax調用,如果這是一個錯誤,我返回一個特定的結構,所以我需要在運行成功之前運行一些東西來檢查響應數據,看它是否包含像1/0全球擴展jQuery ajax成功

樣本響應

{"code": "0", "message": "your code is broken"} 

{"code": "1", "data": "return some data"} 

我無法找到一個方法來做到這一點jQuery的開箱即用,看着預過濾器,ajaxSetup和其他可用的方法,但他們並沒有把它拿下來,我可以想出的賭注是黑客攻擊阿賈克斯方法F A點點:

var oFn = $.ajax; 

$.ajax = function(options, a, b, c) 
{ 
    if(options.success) 
    { 
     var oFn2 = options.success; 

     options.success = function(response) 
     { 
      //check the response code and do some processing 
      ajaxPostProcess(response); 

      //if no error run the success function otherwise don't bother 
      if(response.code > 0) oFn2(response); 
     } 
    } 

    oFn(options, a, b, c); 
}; 

我一直在使用這一段時間,它工作正常,但不知道是否有更好的方式來做到這一點,或者說我在jQuery的文檔錯過。

+4

聽起來像[鴨子衝孔](http://paulirish.com/2010/duck-punching-with-jquery/) – qwertymk 2012-03-22 01:04:20

+0

爲200狀態返回錯誤看起來完全錯誤。將HTTP狀態設置爲適當的錯誤代碼(4xx/5xx)並使用jQuery AJAX錯誤處理程序 – Phil 2012-03-22 01:07:17

+0

@Phil如何驗證錯誤?返回4xx或5xx似乎太籠統了。 – Joseph 2012-03-22 01:15:28

回答

9

你可以建立自己的AJAX的處理程序,而不是使用默認的ajax:

var ns = {}; 
ns.ajax = function(options,callback){ 
    var defaults = {    //set the defaults 
     success: function(data){ //hijack the success handler 
      if(check(data)){  //checks 
       callback(data); //if pass, call the callback 
      } 
     } 
    }; 
    $.extend(options,defaults); //merge passed options to defaults 
    return $.ajax(options);    //send request 
} 

所以你的電話,而不是$.ajax,您現在使用;

ns.ajax({options},function(data){ 
    //do whatever you want with the success data 
}); 
+2

很好的答案,但有一個問題。有時候,.ajax會被Backbone.js等一些第三方庫所使用,因此這種解決方案對於這些情況將不起作用。 – 2013-05-24 18:46:35

+0

@WilsonFreitas:爲什麼它不適用於這些情況? Backbone是否修改原始的$ .ajax函數?否則,我不會看到問題。 – 2014-03-28 15:15:23

+0

@StanislavPalatnik OP想要的是改變原始的AJAX函數,以便使用它的所有東西都可以獲得自定義配置。我的解決方案僅使用自定義配置創建一個新功能,OP可在全局應用程序中使用它,但不能用於其他庫。 – Joseph 2014-03-28 15:34:40

1

這裏有幾個建議:

var MADE_UP_JSON_RESPONSE = { 
    code: 1, 
    message: 'my company still uses IE6' 
}; 

function ajaxHandler(resp) { 
    if (resp.code == 0) ajaxSuccess(resp); 
    if (resp.code == 1) ajaxFail(resp); 
} 

function ajaxSuccess(data) { 
    console.log(data); 
} 

function ajaxFail(data) { 
    alert('fml...' + data.message); 
} 

$(function() { 

    // 
    // setup with ajaxSuccess() and call ajax as usual 
    // 
    $(document).ajaxSuccess(function() { 
     ajaxHandler(MADE_UP_JSON_RESPONSE); 
    }); 

    $.post('/echo/json/'); 

    // ---------------------------------------------------- 
    //    or 
    // ---------------------------------------------------- 

    // 
    // declare the handler right in your ajax call 
    // 
    $.post('/echo/json/', function() { 
     ajaxHandler(MADE_UP_JSON_RESPONSE); 
    }); 
});​ 

工作:http://jsfiddle.net/pF5cb/3/

+0

嗯,雅,但問題是,我有100個Ajax調用每個與「成功」的代碼,如果響應返回一個很好的代碼運行。我將不得不去每個成功函數幷包裝這些代碼。我更喜歡在成功函數中使用乾淨的代碼,而不是讓開發團隊擔心包裝這些人,應該只是工作,至少這是我的目標。 – Rob 2012-03-22 20:56:17

+0

我給出的'ajaxHandler'函數是全局的。如果你使用'ajaxSuccess()'選項,你只需要聲明一次。 – Terry 2012-03-23 01:26:03

+0

是的,但我的成功功能並不完全相同,他們中的許多人在成功的ajax請求上做了不同的事情。 – Rob 2012-03-23 12:49:48

0

這裏最簡單的例子:

$.ajaxSetup({ 
    success: function(data){ 
     //default code here 
    } 
}); 

隨意查找the documentation$.ajaxSetup()

+1

它說:」爲將來的Ajax請求設置默認值。**不建議使用它。**「 – acme 2014-09-08 14:31:19

2

該解決方案透明地將自定義成功處理每一個$.ajax()呼叫使用duck punching技術

(function() { 
    var _oldAjax = $.ajax; 
    $.ajax = function(options) { 
     $.extend(options, { 
      success: function() { 
       // do your stuff 
      } 
     }); 
     return _oldAjax(options); 
    }; 
})(); 
0

這是你的AJAX方法

function getData(newUrl, newData, callBack) { 
      $.ajax({ 
       type: 'POST', 
       contentType: "application/json; charset=utf-8", 
       url: newUrl, 
       data: newData, 
       dataType: "json", 

       ajaxSuccess: function() { alert('ajaxSuccess'); }, 
       success: function (response) { 
        callBack(true, response); 
        if (callBack == null || callBack == undefined) { 
         callBack(false, null); 
        } 
       }, 
       error: function() { 
        callBack(false, null); 
       } 
      }); 
     } 

而且回調的成功或方法成功後調用

$(document).ajaxStart(function() { 
       alert('ajax ajaxStart called'); 
      }); 
      $(document).ajaxSuccess(function() { 
       alert('ajax gvPerson ajaxSuccess called'); 
      }); 
+0

$(document).ajaxSuccess(function(){ alert('ajax gvPerson ajaxSuccess called'); }) ; – 2015-12-15 10:27:26