对Jquery的Ajax进行二次封装,是为了统一请求调用入口,最好也同意响应格式。 此外,还额外增加了防止重复点击的功能,减少冗余代码量。

代码实现

window.apwAjax = function(_this, param, succFunc, alwaysFunc, beforeSendFunc)
{
//防止重复点击
if(_this && 1 == _this.data('click')){
    return;
}
if(_this){
    _this.data('click', 1);
}
//默认 json格式返回
if (param['dataType'] == undefined) {
    param['dataType'] = 'json';
}
// 默认发起POST请求
if (param['type'] == undefined) {
    param['type'] = 'POST';
}

//请求前回调函数
param.beforeSend = function (xhr) {
    if (beforeSendFunc){
        beforeSendFunc(xhr);
    }
};

var request = $.ajax(param)
    .done(function (data, textStatus, jqXHR) {
        //统一处理逻辑
        //认证失败,重新登录处理
        if (401 == jqXHR.status) {
            location.href = '/login';
        }

        //成功回调
        if (succFunc){
            succFunc(data, textStatus, jqXHR);
        }
    }).fail(function (jqXHR, textStatus, errorThrown) {
        if ("parsererror" == textStatus) {
            console.log("返回格式错误");
            return;
        }
        console.log("服务器错误:" + errorThrown);
    }).always(function () {
        if (_this){
            _this.data('click', 0);
        }

        // always回调
        if (alwaysFunc){
            alwaysFunc();
        }
    });

// 返回 request,可以进行后续操作 request.abort()
return request;
};

//调用
apwAjax(null, {url:'/xxx'}, function(d){},null,null);   //不防止重复点击
apwAjax($(this), {url:'/xxx'}, function(d){});   //防止重复点击