第四周学习内容整理
1、前后端调用模式
格式:schema://host:post/path?query#fragment
~~ schema:协议。例如http、https、ftp等
~~ host:域名或者IP地址
~~ port:端口,http默认端口80,可以省略
~~ path:路径,例如/abc/a/b/c
~~ query:查询数据,例如uname=lisi&age=12
~~ fragment:锚点(哈希Hash),用于定位页面的某个位置
符合规则的URL
http://www.itcast.cn
http://www.itcast.cn/java/web
http://www.itcast.cn/java/web?flag=1
http://www.itcast.cn/java/web?flag=1#function
HTTP请求方式
~~ GET ~~ 查询
~~ POST ~~ 添加
~~ PUT ~~ 修改
~~ DELETE ~~ 删减
符合规则的URL地址
http://www.hello.cim/books ~~ GET
http://www.hello.cim/books ~~ POST
http://www.hello.cim/books/123 ~~ PUT
http://www.hello.cim/books/123 ~~ DELETE
2、promise用法
var p = new Promise(function(resolve, reject){
//成功时调用 resolve()
//失败时调用 reject()
});
p.then(function(ret){
//从resolve得到正常结果
},function(ret){
//从reject得到错误信息
});
function queryData() {
return new Promise(function(resolve, reject){
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState != 4) return;
if(xhr.status == 200) {
resolve(xhr.responseText);
}else{
reject('出错了');
}
}
xhr.open('get','/data');
xhr.send(null);
})
}
发送多次ajax请求
queryData()
.then(function(data){
return queryData();
})
.then(function(data){
return queryData();
})
.then(function(data){
return queryData();
});
queryData()
.then(function(data){
console.log(data);
})
.catch(function(data){
console.log(data);
})
.finally(function(data){
console.log('finished');
});
对象方法
Promise.all() 并发处理多个异步任务,所有任务都执行完成才能得到结果
Promise.race() 并发处理多个异步任务,只要有一个任务完成就能得到结果
Promise.all([p1,p2,p3]).then((result) => {
console.log(result)
})
Promise.race([p1,p2,p3]).then((result) => {
console.log(result)
})
3、fenth
fetch(url).then(fn2)
.then(fn3)
...
.catch(fn)
fetch('/abc').then(data=>){
return data.text();
}).then(ret=>{
//注意这里得到的才是最终数据
console.log(data);
});
fetch('/abc', {
method: 'get'
}).then(data=>){
return data.text();
}).then(ret=>{
//注意这里得到的才是最终数据
console.log(ret);
});
GET请求方式的参数传递
fetch('/abc?id=123').then(data=>){
return data.text();
}).then(ret=>{
//注意这里得到的才是最终数据
console.log(ret);
});
fetch('/abc/123', {
method: 'get'
}).then(data=>){
return data.text();
}).then(ret=>{
//注意这里得到的才是最终数据
console.log(ret);
});
DELETE请求方式的参数传递
fetch('/abc/123', {
method: 'delete'
}).then(data=>){
return data.text();
}).then(ret=>{
//注意这里得到的才是最终数据
console.log(ret);
});
POST请求方式的参数传递
fetch('books', {
method: 'post',
body: 'uname=lisi&pwd=123',
headers: {
'content-Type': 'application/x-www-form-urlencoded',
}
}).then(data=>){
return data.text();
}).then(ret=>{
console.log(ret);
});
fetch('/books', {
method: 'post',
body: JSON.stringify({
uname: 'lisi',
age: 12
})
headers: {
'Content-Type': 'application/json' ,
}
}).then(data=>){
return data.text();
}).then(ret=>{
console.log(ret);
});
fetch('/abc') then(data=>){
// return data.text();
return data.json();
}).then(ret=>{
console.log(ret);
});
4、axios用法
axios.get('/adata')
.then(ret=>){
// data属性是固定的用法,用于获取后台响应的数据
console.log(ret.data)
})
axios.get('/adata?id=123')
.then(ret=>){
console.log(ret.data)
})
axios.get('/adata/123')
.then(ret=>){
console.log(ret.data)
})
axios.get('/adata', {
params: {
id: 123
}
})
.then(ret=>){
console.log(ret.data)
})
(2)DELETE传递参数
参数传递与GET相似
axios.delete('/adata?id=123')
.then(ret=>){
console.log(ret.data)
})
axios.delete('/adata/123')
.then(ret=>){
console.log(ret.data)
})
axios.delete('/adata', {
params: {
id: 123
}
})
.then(ret=>){
console.log(ret.data)
})
(3)POST传递参数
通过选项传递参数(默认json格式数据)
axios.post('/adata', {
uname: 'tom',
pwd: 123
}) .then(ret=>){
console.log(ret.data)
})
通过URLSearchParams传递参数(application/x-www-form-urlencoded)
var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/api/test', params).then(ret=>){
console.log(ret.data)
})
(4)PUT传递参数
axios.put('/adata/123', {
uname: 'item',
pwd: 123
}) .then(ret=>){
console.log(ret.data)
})
axios.post('/axios-json').then(ret=>){
console.log(ret)
})
//添加一个请求拦截器
axios.interceptors.request.use(function(config) {
//在请求发出之前进行一些信息设置
return config;
}, function(err){
//处理响应的错误消息
});
(2)响应拦截器
在获取数据之前对数据做一些加工处理
//添加一个响应拦截器
axios.interceptors.request.use(function(res) {
//在这里对返回的数据进行处理
return res;
}, function(err){
//处理响应的错误消息
});
5、async/await的基本用法
~~~ async/await是ES7引入的新语法,可以更加方便的使用异步操作
~~~ async关键字用于函数上(async函数返回值是Promise实例对象)
~~~ await关键字用于async函数当中(await可以得到异步的结果)
async function queryData(id) {
const.ret = await axios.get('/data');
return ret;
}
queryData(ret=>){
console.log(ret)
})
async/await处理多个异步请求
多个异步请求的场景
async function queryData(id) {
const info = await axios.get('async1');
const ret = await axios.get('async2?info=' + info.data);
return ret;
}
queryData(ret=>){
console.log(ret)
})