ajax 封装与应用
凯 5/2/2024 js
# ajax 封装与应用
- axios 使用
- ajax 的封装
- 综合训练 - 图书管理
# 1.axios 使用
jquery: 基于js 做很多函数的封装 ajax 09--13年
axios : 4行 14-21年【主流】 ajax+promise[异步代码]
fetch: w3c 国际标准化定义组织 21年
- promise 介绍
状态机: 属于异步代码 异步代码执行 分层3种状态, 等待 pending 成功reslove 失败reject
异步代码:需要一定时间才可以出执行结果的代码(延时器 定时器,事件的执行函数,ajax),异步代码 打破了js代码的执行顺序
let p = new Promise(function(resolve,reject){})
p.then(function(res){
//如果promise 执行结果为成功 res==成功的返回值
}).catch(function(err){
//err失败的返回值
})
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 代码执行顺序
如果既有 同步代码 也有异步代码,会先执行 所有的同步代码,然后再依次执行 异步代码
console.log(1);
setTimeout(function(){
console.log(2);
},1000)
console.log(3);
setTimeout(function(){
console.log(4);
},0)
document.querySelector('div').addEventListener('click',function(){
console.log(5);
})
console.log(6);
// 1 3 6 2 4 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let xhr = new XMLHttpReqeust();
xhr.open('get','xxxx');
xhr.send()
//监听步骤改变 并获取返回值
xhr.addEventListener('readystatechange',function(){
})
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 2.axios 引入
npm install axios
https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.min.js
bootcdn网站给的 cdn链接复制源代码到本地 axios.js
<!-- <script src="https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.min.js"></script> -->
<script src="./axios.js"></script>
<script>
console.log(axios);
</script>
1
2
3
4
5
2
3
4
5
# 3.通过axios 实现接口调用
- get请求
axios.get('请求地址?请求参数')
.then(function(res){}) //成功获取返回值
.catch(function(err){}) //请求失败
1
2
3
2
3
axios.get('请求地址',{params:{key:val&key1:val1}})
.then(function(res){}) //成功获取返回值
.catch(function(err){}) //请求失败
1
2
3
2
3
post请求
方法
axios.post('请求地址',{key:val&key1:val1})
.then(function(res){}) //成功获取返回值
.catch(function(err){}) //请求失败
1
2
3
2
3
案例
<script src="./axios.js"></script>
<script>
// get请求调用
axios.get('http://8.137.157.16:8099/test/getTest?name=张麻子')
.then(function (res) {
console.log(res.data);
})
.catch(function (err) {
console.log(err); //network time out
})
</script>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 上传文件
方法
let formData = new FormData();
formData.append('file',file)
axios.post('请求地址',formData)
.then(function(res){}) //成功获取到返回值
.catch(function(err){}) //请求失败
1
2
3
4
5
2
3
4
5
案例
let inp = document.querySelector('input')
inp.addEventListener('change',function(){
let file =inp.files[0]
let formData = new FormData()
formData.append('file',file)
axios.post('http://8.137.157.16:8099/test/upload',formData)
.then(function (res) { //成功获取返回值
console.log(res);
})
.catch(function (err) { //请求失败
console.log(err);
})
})
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 4.手动封装ajax
js基础
函数封装
回调深入理解
promise 必须 回调
异步代码块---浏览器事件循环机制--eventloop
let res = http.get('地址',{params:{key:val}})
let res = http.post('地址',{key:val})
let res = http.upload('地址',formData)
1
2
3
4
5
2
3
4
5
1.创建一个独立文件 http.js
2.创建 一个对象 http
3.http对象 有 3个属性 get post upload
4.每个属性的值 都是函数
5.get/post/upload 请求接收了几个数据,返回了什么数据
**解决 异步代码的返回 return ,只能必须使用 回调函数callback **
回调:现在不调(大函数调用的时候) 回头再调(大函数运行有结果的时候)
arr.map(function(item,index){
console.log(item)
console.log(index)
})
1
2
3
4
2
3
4
//等待2s 之后输出两个数字之和
sum(100,200,funciton(res){
console.log(res) // 2打印和
})
function sum(a,b,callback){
setTimeout(functon(){
let c= a+b; //300
callback(c);
},2000)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
http.js
// 1.创建一个独立文件 http.js
// 2.创建 一个对象 http
// 3.http对象 有 3个属性 get post upload
// 4.每个属性的值 都是函数
// 5.get/post/upload 请求接收了几个数据,返回了什么数据
function paramsFormat(params){
// for in Object.keys
let keys = Object.keys(params) // ['name','id']
let str = '';
keys.forEach(function(item,index){ // name id
str = str + `${item}=${params[item]}&`
})
str = str.slice(0,-1);
return str;
}
const http = {
get: function (url,data={params:{}},callback) {
let res = null;
// 参数的拼接
// {name:'张麻子',id:'111'} ===》key=val&key1=val
const params = data.params; // {name:'张麻子',id:'111'}
let str = paramsFormat(params)
// ajax 核心4句
let xhr = new XMLHttpRequest();
xhr.open('get',url+'?'+str)
xhr.send()
xhr.onreadystatechange = function(){
if(xhr.readyState ==4 && xhr.status ==200){
res = JSON.parse(xhr.responseText);
// 调用函数 传递数据给页面
callback(res)
}
}
// 如果函数在运行过程中,运行到了 结束的}
// 都没有看到return 自动返回undefined
// return ;
},
post: function () {
},
upload: function () {
},
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
- 调用方式
<script src="./http.js"></script>
<script>
// get
http.get('http://8.137.157.16:8099/test/getTest', { params: { name: '张麻子', id: '111' } },function(res){
console.log(res);
})
// post
http.post('地址',{name:'张麻子'},function(res){
console.log(res); //后端返回数据
})
// 文件上传
let formDta = new FormData()
fomrData.append('file',file)
http.upload('地址',formData,function(res){
console.log(res); //后端返回数据
})
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23