ajax promise

本文介绍了一个使用原生JavaScript实现的Ajax请求封装方法,通过Promise来简化异步操作流程。该方法支持GET和POST等HTTP请求方式,并能处理JSON数据类型。文章详细展示了如何设置请求参数、处理响应数据及错误情况。
<script>
    function ajaxPromise(options){
        let {
            type='get',
            url,
            data = {},
            dataType = 'json',
            cache = false // 不缓存
        } = options;
        //data参数处理
        let str = '';
        for(let k in data){
            if(data.hasOwnProperty(k)){
                str += `${k}=${data[k]}&`
            }
        }
        str = str.slice(0,str.length-1);
        //处理 url
        //判断是否是get请求
        let isGet = null;
        if(/get|head|delete/.test(type)){
            isGet = true;
        }else {
            isGet = false;
        }
        if(isGet){ // 是get系列请求
            if(url.indexOf('?') == -1){
                url += `?${str}`;
            }else {
                url = url.replace(/&$/,'');
                url += `&${str}`;
            }
            // cache ? null : url+=`&t=${Math.random()}`;
            cache ? null : url+=`&t=${new Date().getTime()}`;
        }
        return new Promise(function (resolve, reject) {
            //这里边的是做原生ajax;
            let xhr = new XMLHttpRequest();
            xhr.open(type,url);// 默认做成异步
            xhr.onreadystatechange = function () {
                if(xhr.readyState == 4 && /^2\d{2}|304/.test(xhr.status)){
                    //成功获取数据
                    //根据不同数据类型处理数据
                    let data = null;
                    switch (dataType){
                        case 'json':
                            data = JSON.parse(xhr.responseText);
                            break;
                        case 'xml':
                            data = xhr.responseXML;
                            break;
                        default:
                            data = xhr.responseText;
                    }
                    resolve(data);
                }
                if(xhr.readyState == 4 && /^[45]\d{2}/.test(xhr.status)){
                    //获取失败;
                    reject(xhr);
                }
            };
            if(!isGet){
                xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
            }
            xhr.send(str);
        })
    }


    ajaxPromise({
        url:'./1.json',
        data:{q:1},
    }).then((data)=>{
        console.log(data);
        data.push(1234);
        return data;
    }).then((data)=>{
        console.log(data);
    }).catch(()=>{

    });
</script>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值