简单的基于promise的ajax封装
基于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))
打印:
简单的基于promise的ajax封装的更多相关文章
- Promise实战AJAX封装
一.利用Promise的知识,对最开始的ajax的例子进行一个简单的封装: var url = 'xxx'; // 封装一个get请求的方法 function request(url){ return ...
- 简单的基于Vue-axios请求封装
具体实现思路=>封装之前需要用npm安装并引入axios,使用一个单独的js模块作为接口请输出对象,然后export dafult 这个对象. 1.首先我们需要在Vue实例的原型prototyp ...
- 基于jQuery的ajax对WebApi和OData的封装
基于jQuery的ajax对WebApi和OData的封装 WebApi 的使用带来了一个显著的特点,对type有一定的要求.一般ajax的type无非就是两种,GET和POST.如果用JSONP来跨 ...
- 最简单的基于FFMPEG的封装格式转换器(无编解码)
本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...
- 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- 最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- 最简单的基于FFmpeg的封装格式处理:视音频分离器简化版(demuxer-simple)
===================================================== 最简单的基于FFmpeg的封装格式处理系列文章列表: 最简单的基于FFmpeg的封装格式处理 ...
- 基于jquery的ajax方法封装
在实际的项目里,ajax的应用频率很高,所以尽管jquery或者其他的一些类似的js库做了非常不错的封装,仍然有进一步封装简化的空间和必要 举一个例子,很久很久以前,我的ajax是这么写的: $.aj ...
- 原生 Ajax 封装 和 Axios 二次 封装
AJAX 异步的JavaScript与XML技术( Asynchronous JavaScript and XML ) Ajax 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...
随机推荐
- 实例透彻分析CMS垃圾收集器执行过程
CMS收集器收集步骤: 在上一次[https://www.cnblogs.com/webor2006/p/11055468.html]中已经对CMS的垃圾收集器有了一定的理论上的了解,其中提到了CMS ...
- Jenkins如何集成运行testng.xml文件的解决方案
前言: 在我们使用maven+testng+restassured+reportng实现接口测试框架时,会发现在本机创建项目,进行一些pom引用和简单的封装后,很快就可以直接利用idea自带的test ...
- 《滴滴自研分布式 NoSQL 数据库 Fusion 的演进之路》
SSD:采用闪存: 读的速度很快:写入数据时,因为需要通过加压的方式对存储单元进行电子填充,所以速度略慢:擦除速度最慢,擦除块的时间在ms级.在使用SSD的时,需要考虑到SSD的读写不平衡的特性. 滴 ...
- GitHub 上优秀的开源SLAM repo (更新中)
GitHub 上优秀的开源SLAM repo (更新中) 欢迎 watch/star/fork 我们的 GitHub 仓库: Awesome-SLAM, 或者follow 项目的主页:Awesome- ...
- CF757F Team Rocket Rises Again
题意 建出最短路图(DAG)之后就跟这题一样了. code: #include<bits/stdc++.h> using namespace std; #define int long l ...
- WinSxS目录下文件的清除
1)McAfee Scanner service 持续高cpu 2)上网查到了,需要看 %deflogdir%目录下的OnDemandScan_Activity.log 3) 打开这个文件,发觉一直在 ...
- 【day06】PHP
一.字符串函数库 1.安装 2. (1)strlen:获得字符串的字符长度 (2)substr:字符串截取 格式: string substr(string $var, ...
- Codeforces Round #554 (Div. 2) D 贪心 + 记忆化搜索
https://codeforces.com/contest/1152/problem/D 题意 给你一个n代表合法括号序列的长度一半,一颗有所有合法括号序列构成的字典树上,选择最大的边集,边集的边没 ...
- C读取json格式字符串
python调用C库时参数太多,约定传json格式字符串,C解析 #include<stdio.h> #include<string.h> #include<stdlib ...
- [NewLife.XCode]百亿级性能
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...