用ES6的方式封装原生Ajax

3 篇文章 0 订阅
1 篇文章 0 订阅
const doAjax = Symbol('doAjax');

function randomNum(){
  var num = '';
  for(var i = 0; i < 20; i++){
    num += Math.floor(Math.random() * 10);
  }
}

function formDatas(obj){
  var str = '';
  for(var key in obj){
    str += key + '=' +obj[key] + '&';
  }
  return str.replace(/&$/, '');
}

class HTTP {
  [doAjax](options){
    //实例化XMLHTTPRequest,并且判断浏览器是否支持XMLHttpRequest,如果不支持就用ActiveXObject('Microsoft.XMLHTTP');
    let o = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
    
    //判断浏览器是否支持异步发起HTTP请求
    if(!o){
      throw new Error('您的浏览器不支持异步发起HTTP请求');
    }
    
    //配置配置项
    let opt = options || {},
        type = (opt.type || 'GET').toUpperCase(),
        async = '' + opt.async === 'false' ? false : true,
        dataType = opt.dataType || 'JSON',
        jsonp = opt.jsonp || 'cb',
        jsonpCallback = opt.jsonpCallback || 'JQuery' + randomNum() + '_' + new Date().getTime(),
        url = opt.url,
        data = opt.data || null,
        timeout = opt.timeout || 30000,
        error = opt.error || function(){},
        success = opt.success || function(){},
        complete = opt.complete || function(){},
        t = null;
    
    //判断是否含有url,
    if(!url){
      throw new Error('您没有填写URL');
    }
   
    //判断dataType和type,如果dataType为jsonp,type为GET
    if(dataType.toUpperCase() === 'JSONP' && type !== 'GET'){
      throw new Error('如果dataType为JSONP,那么type请您设置为GET或者不设置');
    }
    
   //如果dataType为JSONP
    if(dataType.toUpperCase() === 'JSONP'){
      var oScript = document.createElement('script'),
          oScript.src = url.indexOf('?') === -1
                            ? url + '?' + jsonp + '=' + jsonpCallback
                            : url + '&' + jsonp + '=' + jsonpCallback;
      document.body.appenChild(oScript);
      document.body.removeChild(oScript);
      window[jsonpCallback] = (data) => {
        success(data);
      };
      return;
    }
    
    //调用onreadystatechange
    o.onreadystatechange = () => {
      if(o.readyState === 4){
        if((o.status >= 200 && o.status < 300) || o.status === 304){
          switch(dataType.toUpperCase()){
            case 'JSON':
              success(JSON.parse(o.responseText));
              break;
            case 'TEXT':
              success(o.responseText);
              break;
            case 'XML':
              success(o.responseXML);
              break;
            default:
              success(JSON.parse(o.responseText));
              break;
          }
        }else {
          error();
        }
        complete();
        clearTimeout(t);
        t = null;
        o = null;
      }
    }
    
    //打开通道
    o.open(type, url, async);
    type === 'POST' && o.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    //发送请求
    o.send(type === 'GET' ? null : formDatas(data));
    
    t = setTimeout(() => {
      throw new Error('本次请求已超时,API地址为'+ url);
      o.abort();
      clearTimeout(t);
      t = null;
      o = null;
    },timeout);
  }
  
  ajax(opt){
    this[doAjax](opt);
  }
  
  post(url,data,dataType,successCB,errorCB,completeCB){
    this[doAjax]({
      type: 'POST',
      url: url,
      data: data,
      dataType: dataType,
      success:successCB,
      error:errorCB,
      complete:completeCB
    });
  }
  
  get(url,dataType,successCB,errorCB,completeCB){
    this[doAjax]({
        type: 'GET',
        url: url,
        dataType: dataType,
        success:successCB,
        error:errorCB,
        complete:completeCB
      });
  }
}

export { HTTP };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__潇湘夜雨__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值