如何优化(最小化)jQuery AJAX调用

时间:2013-10-23 08:16:49

标签: javascript jquery ajax

我的代码的不同功能有50多个AJAX调用。所有这些调用都有类似的结构,具有不同的data / url / callback参数:

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”变量传递给该函数,但它似乎不是一个优雅的解决方案。

如何以优雅的方式提出建议?

谢谢

2 个答案:

答案 0 :(得分: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(),并传递整个选项对象:

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

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

答案 1 :(得分: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);
});

有些部分应该写得更加谨慎;以上示例旨在说明如何将重复的ajax调用包装在公共API中。