promise封装ajax

promise:
	promise是一个对象,用来传递异步操作的消息。有了 Promise 对象,
	就可以将异步操作以同步操作的流程表达出来。
promise特点:
	承诺将来会执行
	**防止回调地狱** - Callback Hell
	可以进行then的**链式执行**
	区分数据请求和数据处理
三种状态
	pending:等待中,或者进行中,表示还没有得到结果
	resolved(fullfilled):已经完成,表示得到了我们想要的结果,可以继续往下执行
	rejected:也表示得到结果,但是由于结果并非我们所愿,因此拒绝执行	
	调用时会被传递两个参数:resolve和reject函数
具备then()方法,对于then()方法有以下简单的要求:
	接收完成态、错误态的回调方法
	可选地支持progress事件回调作为第三个方法
	只接受function对象
	返回Promise对象,以实现链式调用
var ajaxOptions = {
  url: '#',                       //url地址,默认"#"
  method:  'GET',                 //请求方法,仅支持GET,POST,默认GET
  async: true,                    //是否异步,默认true
  timeout: 0,                      //请求时限,超时将在promise中调用reject函数
  data: null,                     //发送的数据,该函数不支持处理数据,将会直接发送
  dataType: 'text',               //接受的数据的类型,默认为text
  headers: {},                     //一个对象,包含请求头信息
  onprogress: function (){},      //处理onprogress的函数
  ouploadprogress: function() {}, //处理.upload.onprogress的函数
  xhr: null                       //允许在函数外部创建xhr对象传入,但必须不能是使用过的
}//
var promiseAjax = (optionsOverride) => {
    // 将传入的参数与默认设置合并
    var options = {};
    for (var k in ajaxOptions) {
        options[k] = optionsOverride[k] || ajaxOptions[k];
    }
    options.async = options.async === false ? false : true;
    var xhr = options.xhr = options.xhr || XMLHttpRequest ? new XMLHttpRequest() : new window.ActiveXObject('Microsoft.XMLHTTP');

    return new Promise((reslve, reject) => {
      xhr.open(options.method, options.url, options.async);
      xhr.timeout = options.timeout;
      //设置请求头
      for (var k in options.headers) {
          xhr.setRuquestHeader(k, options.headers[k]);
      }
      // 注册xhr对象事件
      xhr.onprogress = options.onprogress;
      xhr.upload.onprogress = options.onuploadprogress;
      xhr.responseType = options.dataType;

      xhr.onloadend = function () {
        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304){
          resolve(xhr.responseText, xhr);
        }else{
          var resJson = {
              code: xhr.status,
              response: xhr.response
          }
          reject(resJson, xhr)
        }
      } 

      try {
        xhr.send(options.data);
      }
      catch (e) {
        reject({
            errorType: 'send_error',
            error: e
        });
      }
    })
}

/* ajax({
  url: 'http://localhost:8080/dy',
  async: true,
  onprogress: function (e) {
      console.log(e.position/e.total);
  },
  dataType:'text/json'
})
.then(function (xhr) { console.log(xhr.response.name); },
function (e) { console.log('失败回调') }) */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值