利用 jQuery 封装一层 ajax 方法

虽然 jQuery 对ajax 已经做了一层封装,操作起来已经很简单了就像下面这样:

$.ajax({
    url: '/role/list',
    type: 'get'
    success: function (data) {
        // 请求成功的业务处理
    },
    error: function (e) {
        // 请求失败的业务处理
    }
})

即便是这样简单,同一个请求可能在一个js的很多地方都需要调用。而且存在同一个接口在别的页面中也会调用。当js文件中到处都是这种代码的时候,维护起来就很麻烦。

本着 Java 设计原则 单一职责原则、最少知识原则 同一段代码写且只写一次。有必要将调用接口封装出来统一管理

首先,像接口API这种东西需要隐藏起来对 HTML 页面调用方做到无感知,新建一个JS 文件单独存放 API 和接口调用函数

let ROLE_LIST = "/role/list"

function getDict() {
    return $.ajax({
        url: ROLE_LIST,
        type: 'GET'
    })
}

这样,在调用方只需要引入JS文件,像下面这样写即可:

<script src="role.js" type="text/javascript"></script>
<script>
getDict().done(function(data){
    // 请求成功的业务处理
}).fail(function(e){
    // 请求失败的业务处理
})
</script>

这样即使需要显式的调用 API 也只需要使用 JS 中的常量即可,后期如果接口变动也只需要更改一次即可,写且只写一次。

但是现在依然还有些不足,当前后端使用 JSON 数据格式交互以相应字段做为业务处理成功与否的标志时,就像下面这样:

# code 0-成功 1-失败
{
    'code': '0',
    'data;: {},
    'msg': '操作结果'
}

成功了,一般会有 data 和 msg

如果失败了,只会有失败的 msg 返回到前端

这样即使请求成功也需要进一步对响应结果进行判断:

<script src="role.js" type="text/javascript"></script>
<script>
getDict().done(function(data){
    if(data.code === 0) {
        // 业务处理成功的业务处理
    } else {
        // 业务处理失败的业务处理
    }
}).fail(function(e){
    // 请求失败的业务处理
})
</script>

这样每次都要在请求成功后进行判断并处理,对此还可以再封装一层:

let DICT_LIST = "/dict/list"

/**
 * 对外隐藏API和请求方式
 */
function getDict() {
    return handleAjax(DICT_LIST)
}

/**
 * 封装一层ajax
 */
function handleAjax(url, data, type) {
    return $.ajax({
        url: url,
        data: data || {},
        type: type || 'GET'
    }).then(function(resp){
        if(resp.code === 0){
            return resp.data;
        }
        else{
            return $.Deferred().reject(resp.msg);
        }
    }, function(err){
        console.log(err.status);
    });
}

这样之后,只需要调用方法,处理结果请求结果即可,不需要关心接口是什么,用什么方式请求的。专注于业务处理即可

<script src="../api/system/dict.js" type="text/javascript"></script>
<script>
getDict().done(function (data) {
    console.log(data)
}).fail(function (msg) {
    console.log(msg)
})
</script>