基于promise的ajax封装

 //调用方式:
/*
ajaxPrmomise({
url:,
method:,
headers:{}
}).then(res=>{})
*/ ;(function(window){
//设置默认的参数配置项
let _default = {
url:'',
baseURL:'',
method:'GET',
params:null, //get请求基于问号传参方式传递给服务器的内容
headers:{},
timeout:500,
dataType:'json',
data:null, //post请求基于请求主体传参方式传递给服务器的内容
cache:true //是否缓存数据
};
//resolve,reject,response,fn
let _setResponseMsg = function _setResponseMsg(...rest){
let [
resolve,
reject,
xhr,
fn
] = rest,
res = null,
response = xhr;
res.data = fn(response.responseText);
res.status = response.status;
res.statusText = response.statusText;
res.xhr = response;
res.headers = response.getAllResponseHeaders();
resolve(res)
} let _convertJSON = function _convertJSON(result){
let data = "";
try {
data = JSON.parse(result);
} catch (e) {
reject(e)
}
return data
} let _convertString = function _convertString(result){
return result;
} let _array_to_str = function _array_to_str(key,arr){
let params = "";
for(let i0;i<arr.length;i++){
params += `${key}=${arr[i]}&`;
}
return params.slice(0,-1)
} let _convertParams = function _convertParams(cache,params){
let str = "?",
time_str = cache ? "":(+(new Date())+"");
if(typeof params == 'object' && Object.keys(params).length > 0){
for(let key in params){
if(typeof params[key] == 'object' && (length in params[key])){
str += _array_to_str(key,params[key])
}
str += `${key}=${params[key]}`;
}
}
return str+"&_="+time_str;
} let _setHeader = function _setHeader(...res){
let [xhr,headers] = res;
for(let key in headers){
if(headers.hasOwnProperty(key))
xhr.setRequestHeader(key,headers[key])
}
} //基于promise管理ajax请求
let ajaxPrmomise = function ajaxPrmomise(options={}){
// 这里传递的options包含默认配置信息和用户基于暴露的_default修改后的信息
for(let key in _default){
if(key in options && _default.hasOwnProperty(key)){
options[key] = _default[key]
}
}
//=>这里可以写成
options = {..._default,...options};
let {
url,
method,
baseURL,
data,
dataType,
headers,
cache,
params
} = options;
let xhr,send_data; return new Promise((resolve,reject)=>{
xhr = new XMLHttpRequest();
_setHeader(xhr,headers);
send_data = method.toLowerCase() == 'get' ? _convertParams(cache,params):(method.toLowerCase() == 'post'? data:"");
all_url = baseURL + url + send_data;
xhr.open(method,all_url);
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(/^[23]\d{2}$/.test(xhr.status)){
dataType = dataType.toUpperCase();
if(dataType == "json")
_setResponseMsg(resolve,reject,xhr,_convertJSON)
_setResponseMsg(resolve,reject,xhr,_convertString)
}
}
}
ajaxPrmomise.xhr = xhr;
xhr.send(send_data);
})
}
//修改默认配置,可以通过自己设置一些配置来覆盖默认配置
ajaxPrmomise.defaults = _default; ["get","head","options",""].forEach((method,indexs)=>{
ajaxPrmomise[method] = function(url,options){
return ajaxPrmomise({
...options,
url:url,
method:method
})
}
});
["post","put"].forEach((method,index)=>{
ajaxPrmomise[method] = function(url,data,options){
return ajaxPrmomise({
...options,
url:url,
data:data,
method:method
})
}
})
window.ajaxPrmomise = ajaxPrmomise;
}(window))

打印:

最新文章

  1. win32 treeview
  2. ng-init
  3. Objective-C命名编写规范
  4. 2.2CUDA-Memory(存储)和bank-conflict
  5. 绘图工具graphviz学习使用
  6. linux 下上传 datapoint数据到yeelink 修改版本
  7. Compass 更智能的搜索引擎(1)--入门
  8. Django练习——TodoList
  9. springboot整理
  10. GetPJData - uGetHttpData.pas
  11. iRate---一个跳转AppStore评分弹窗
  12. Luogu 1023 - 税收与补贴问题 - [数学题]
  13. iSCSI网络协议.学习笔记
  14. Appium 学习二:切换Webview
  15. Hyper-V 与 VMware 和 vbox 的不兼容
  16. 时间复杂度On和空间复杂度O1是什么意思?
  17. Laravel Relationship Events
  18. Mac下,(OS系统)IDEA 逆向工程,生成 hibernate 映射文件以及对应的javaBean(类似于eclipse)
  19. eclipse菜单栏工具
  20. 第十届Mockplus ▪ UXPA用户体验西南赛区决赛成功举行

热门文章

  1. CodeForces - 1256D (贪心+思维)
  2. Jmeter通过正则表达式获取登录后token
  3. centos7.6离线安装mysql5.7(附下载链接)
  4. Redis windows版本资源与安装
  5. 元昊讲django框架
  6. dirb参数解析
  7. 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)
  8. telnet: Unable to connect to remote host: No route to host
  9. JS解决所有浏览器连续输入英文字母不换行问题,包括火狐(转)
  10. vuex 源码解析(三) getter属性详解