简单的基于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 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...
随机推荐
- CentOS7设置开机自启动方式
方式一: # 在/etc/rc.d/rc.local文件中追加启动命令,该文件追加后,会随着机器自动后,自动运行文件中的命令 # vim /etc/rc.d/rc.local # 权限问题:在cent ...
- GitHub密钥生成
前提电脑上需装有Git软件 这里提供百度云下载地址:https://pan.baidu.com/s/1r0y4XRyQCz7ZJBnZJhAtqw 提取码:88qf 1.登录GitHub账号 2.点 ...
- web-文件包含
提示 构造payload ?file=flag.php 得到一串字符,那么我们用PHP伪协议尝试一下 构造payload ?file=php://filter/read=convert.base64- ...
- 非阻塞式I/O
套接字的默认状态是阻塞的.这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待相应的操作完成.可能阻塞的套接字调用可分为以下4类 (1)输入操作,包括read,readv,recv ...
- 【CSP-S 2019】D2T1 Emiya 家今天的饭
Description 传送门 Solution 算法1 32pts 爆搜,复杂度\(O((m+1)^n)\) 算法2 84pts 裸的dp,复杂度\(O(n^3m)\) 首先有一个显然的性质要知道: ...
- django haystack报错: ModuleNotFoundError: No module named 'blog.whoosh_cn_backend'
在配置django haystack时报错: 解决方案: 将ENGINE的值 改为 这样就可以了.
- 洛谷P1283 平板涂色 &&一本通1445:平板涂色
题目描述 CE数码公司开发了一种名为自动涂色机(APM)的产品.它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色. 为了涂色,APM需要使用一组刷子.每个刷子涂一种不同的颜色C.APM拿 ...
- BFS(四):搜索状态判重
在采用广度优先算法进行搜索时,一个需要重点注意的是在搜索过程中判重和去重.前面介绍的几个例子中,判重都较简单,如采用vis[]数组,若vis[i]==0,则i未访问过,i入队列:若vis[i]!=0, ...
- LeetCode 21:合并两个有序链表 Merge Two Sorted Lists
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. Merge two sorted linked lists and return it as a new ...
- php,mysql结合js解决商品分类问题,从而不必联表查询
首先mysql数据表中的商品分类用varchar类型,比如AA,BB,CC,DD等 其次编写一个js文件,用于定义常量,比如 ‘AA’ = ‘中药’; 'BB' = '西药'; 'CC' = '保健 ...