简单的基于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 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...
随机推荐
- itest(爱测试) 3.3.5 发布,开源敏捷测试管理 & BUG 跟踪管理软件
v3.3.5 下载地址 :itest下载 itest 简介:查看简介 V3.3.5 有 6个功能增强,2个BUG修复 ,详情如下所述. 用户反馈并强烈要求增强的功能实现: 1: 测试用例管理可线 ...
- 27.Java基础_多态
父类对象引用子类对象: Animal a=new Cat(); 多态中的转型 public class Animal { public void eat(){ System.out.println(& ...
- gyp --depth . -D component=shared_library -Ibuild/standalone.gypi build/all.gyp
gyp --depth . -D component=shared_library -Ibuild/standalone.gypi build/all.gyp
- luoguP1040 加分二叉树
在做各类DP的时候都要思路清晰! #include<cstdio> #include<algorithm> using namespace std; const int N = ...
- 富文本编辑器Simditor
文档地址:https://simditor.tower.im/docs/doc-usage.html 父组件: options: { placeHolder: 'this is placeHolder ...
- [C2] 逻辑回归(Logistic Regression)
逻辑回归(Logistic Regression) 假设函数(Hypothesis Function) \(h_\theta(x)=g(\theta^Tx)=g(z)=\frac{1}{1+e^{-z ...
- 第九周周四计划&&周三总结
今天由于自己的原因进度不是很大,今天整理了一下全网关联的思路流程(个人可能就是那种没自信,在思路不知道对不对的情况下不敢下手那种渣渣),和之前的一个学长讨论了一下大概思路流程,如下: (1)使用LDA ...
- CentOS7 安装 anaconda
Anaconda是一个开源的Python发行版本,可以帮助我们更方便地配置Python环境. 如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版 0. 开始前 ...
- 《Java多线程设计模式》学习
还是别人的笔记比较详细: https://segmentfault.com/blog/ressmix_multithread?page=3 mark.
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) E. Rock Is Push dp
E. Rock Is Push You are at the top left cell (1,1) of an n×m labyrinth. Your goal is to get to the b ...