2013-10-23 27 views
5

我有來自我的代碼的不同功能的超過50個AJAX調用。所有這些調用也有類似的結構,不同的數據/地址/回調PARAMS:如何優化(最小化)jQuery AJAX調用

var jqXHR = $.post('/dba/port.php', { 
     mode: "del_wallfunds", 
     pdata: cdata, 
     wname: wName 
    }, 
    function (data) {}, "json") 
    .done(function (data) { 
     var msg = data.msg; 
     if (msg.indexOf("Error") == -1) { 
      alertify.success(msg); 
      delSelected(selGroup); 
     } else { 
      alertify.error(msg); 
     } 
    }) 
    .fail(function() { 
     alertify.error("Error ....."); 
    }); 

我在想怎麼寫,將返回VAR jqXHR儘量減少代碼的總大小的功能。這不是一個問題,通過像URL,錯誤字符串等所有靜態變量等。但問題是,「.done」上的所有回調函數是不同的,我不知道如何將這些回調函數作爲變量傳遞。

一種方法是在.done上調用一個「通用」函數,並將「switch」變量傳遞給該函數,但它似乎不是一個優雅的解決方案。

任何建議如何在一些優雅的方式嗎?

感謝

回答

4

要麼調用你的函數時傳遞done回調函數作爲參數:

function ajaxCall(url, data, doneCallback) { 
    return $.post(url, data, doneCallback, "json").fail(...); 
    // or 
    return $.post(url, data, function() {}, "json").done(doneCallback).fail(...); 
} 

var jqXhr = ajaxCall('yoururl.php', {key: 'value'}, function(data) { 
    // do something 
}); 

或者從函數返回的jqXhr對象,並指定done回調則:

function ajaxCall(url, data) { 
    return $.post(url, data, function() {}, "json").fail(...); 
} 

var jqXhr = ajaxCall('yoururl.php', {key: 'value'}); 
jqXhr.done(function(data) { 
    // do something 
}); 

或者切換到使用jQuery.ajax()代替,並傳遞整個選項對象s在:

function ajaxCall(options) { 
    return $.ajax(options).fail(...); 
} 

var jqXhr = ajaxCall({ 
    url: 'yoururl.php', 
    data: {key: 'value'}, 
    dataType: 'json' 
}); 
jqXhr.done(function(data) { 
    // do something 
}); 
0

你可以嘗試:

  • 轉「請求成功返回處理錯誤」變成了「拒絕請求」,
  • 把「alertify」處理在一個共同的回調

這是什麼,這可能給草圖:

function myAjaxApi(url, data){ 
    var myAjaxCall = $.post(url, data, function (data) {}, "json") 
    .then(function (data) { 
    // using .then : change "request succesful with error state" 
    // to "rejected state" 
     var msg = data.msg; 
     if (msg !== undefined && msg.indexOf("Error") >= 0) { 
      var dfd = $.Deferred(); 
     // try to match the same signature as the "error" option 
      dfd.reject(this, msg); 
      return dfd; 
     } else { 
      return data 
     } 
    }); 

    myAjaxCall.done(function(data){ 
     if (data.msg) { 
      alertify.success(data.msg); 
     } 
    }).fail(function (jqxhr, msg) { 
     if (!msg) { msg = "Error ....."; } 
     alertify.error(msg); 
    }); 
    return myAjaxCall; 
} 

//usage 
myAjaxApi('/dba/port.php', {mode: "del_wallfunds", pdata: cdata, wname: wName}) 
.done(function (data) { 
// the ".done()" queue will not be executed if msg contains "Error" ... 
    delSelected(selGroup); 
}); 

一些零件應該更加小心地書寫;上面的例子是爲了說明如何在一個通用API中包裝重複的ajax調用。