使用promise构造函数封装ajax

*/
/**
 * 发送ajax请求的函数
 * @param {object} obj 发送ajax的配置项
 * @returns undefined
 */
function ajaxPromise(obj){
    return new Promise(function(resolve, reject){
        if(obj.url === undefined) throw new Error('请求地址不能为空')
        if(Object.prototype.toString.call(obj.url) != '[object String]') throw new Error('请求地址错误')
        if(obj.method === undefined) obj.method = 'get'
        if(obj.method.toLowerCase() != 'get' && obj.method.toLowerCase() != 'post') throw new Error('请求方式只能是get或post')
        if(obj.isAsync === undefined) obj.isAsync = true
        if(Object.prototype.toString.call(obj.isAsync) != '[object Boolean]') throw new Error('isAsync必须是布尔值')
        if(!obj.data) obj.data = null
        var data = ''
        if(obj.data != undefined){
            if(Object.prototype.toString.call(obj.data) === '[object String]'){
                if(!obj.data.includes('=')) throw new Error('data数据是非法的!')
                data = obj.data
            }else if(Object.prototype.toString.call(obj.data) === '[object Object]'){
                var arr = []
                for(var key in obj.data){
                    arr.push(key + '=' + obj.data[key])
                }
                data = arr.join('&')
            }else throw new Error('data必须是字符串或对象')
            if(obj.method.toLowerCase() === 'get') obj.url += '?' + data
        }
        if(obj.dataType === undefined) obj.dataType = 'json'
        if(obj.dataType.toLowerCase() != 'json' && obj.dataType.toLowerCase() != 'xml' && obj.dataType.toLowerCase() != 'text') throw new Error('dataType只接受json、text、xml')
        var xhr = new XMLHttpRequest;
        xhr.onreadystatechange = function(){
            if(xhr.readyState === 4){
                if(xhr.status>=200 && xhr.status<300){
                    var res = '';
                    switch(obj.dataType.toLowerCase()){
                        case 'json':
                            res = xhr.responseText
                            res = JSON.parse(res)
                        break;
                        case 'xml':
                            res = xhr.responseXML
                        break;
                        case 'text':
                            res = xhr.responseText
                        break;
                    }
                    resolve(res)
                }else reject()
            }
        }
        xhr.open(obj.method, obj.url, obj.isAsync);
        if(obj.method.toLowerCase() === 'post' && data){
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
            xhr.send(data)
            return
        }
        xhr.send()
    })
}
/// 调用模板 //
/*
ajaxPromise({
    url: '', // 请求地址 - 必填项
    method: '', // 请求方式 - 可选项,默认get
    data: '', // 请求主体 - 可选项 - 允许字符串/object
    isAsync: true, // 是否异步 - 可选项 - 默认true
    dataType: 'json', // 希望返回的数据格式 - 可选项 - 默认json - 允许json/xml/text
})
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值