通用$ .ajax()调用函数的可重用性

时间:2013-11-11 16:39:57

标签: javascript jquery ajax

我正在创建一个应用程序,我对远程服务器进行了大量的ajax调用并广泛使用它们。由于代码在所有调用中几乎相同,我想创建一个可以重用的新函数。我很高兴为“data”参数定义参数结构。我将在下面解释我的问题。

下面提供了我当前的ajax调用示例。

当前通话样本:

$.ajax({
    beforeSend: function() {
        $.mobile.loading('show');
    },
    complete: function() {
        $.mobile.loading('hide');
    },
    type: 'GET',
    url: 'http://localhost/test-url/',
    crossDomain: true,
    data: {appkey: '1234567', action: 'action1','name':'me'},
    dataType: 'jsonp',
    contentType: "application/javascript",
    jsonp: 'callback',
    jsonpCallback: 'mycallback',
    async: false,
    error: function() {
        //some operations
    },
    success: function(data) {
        //some operations
    }
});

我创建的可重复使用的功能:

function newAjax(parm, successCallback, errorCallback) {
    $.ajax({
        beforeSend: function() {
            $.mobile.loading('show');
        },
        complete: function() {
            $.mobile.loading('hide');
        },
        type: 'GET',
        url: 'http://localhost/test-url',
        crossDomain: true,
        data: {appkey: '1234567', parm: parm},
        dataType: 'jsonp',
        contentType: "application/javascript",
        jsonp: 'callback',
        jsonpCallback: 'mycallback',
        async: false,
        success: function() {
            successCallback();
        },
        error: function() {
            errorCallback();
        }
    });
}

问题:

  • 我将通过“parm”参数传递ajax调用的参数。我希望将数据值直接添加到父“data”参数中。而不是作为数据的子对象。所有通话中的appKey保持不变,因此我将其保留在实际功能中。

  • 我希望成功和错误回调函数都是可选的。如果没有提供,则应予以忽略。

1 个答案:

答案 0 :(得分:5)

  1. 您可以使用jQuery.extend方法将两个或多个对象组合在一起。

    data: jQuery.extend({appkey: '1234567'}, parm),
    
  2. 您可以使用successCallback检查您是否实际传递了errorCallbacktypeof var === 'function'的功能;

    success: function () {
        if (typeof successCallback === 'function') {
            successCallback();
        }
    }, 
    
    error: function () {
        if (typeof errorCallback === 'function') {
            errorCallback();
        }
    }
    

    ...如果您刚刚返回由AJAX请求创建的Promise,它可能是 nicer ,并让调用者添加他们的成功,如果他们想要错误处理程序;

    function newAjax(parm) {
       return jQuery.ajax({
           /* as before, but without success and error defined */
       });
    }
    

    ......然后:

    newAjax().done(function () {
        // Handle done case
    }).fail(function () {
        // Handle error case.
    });
    

    如果调用者不想添加错误处理程序,他们就不会调用fail();

    newAjax().done(function () {
        // Handle done case
    });