Ajax与Fetch的区别
fetch是ajax的替代品;基于标准Promise实现支持async/await,可读性更高,避免了ajax回调地狱的痛点。
Ajax的核心是XMLHttpRequest对象,浏览器正是通过XMLHttpRequest对象进行http通信;
//1.创建Ajax对象
if(window.XMLHttpRequest){
let oAjax=new XMLHttpRequest();
}else{
let oAjax=new ActiveXObject("Microsoft.XMLHTTP"); //兼容老版本IE
}
//2.连接服务器(打开和服务器的连接)
oAjax.open('GET', url, true);
//3.发送
oAjax.send();
//4.接收
oAjax.onreadystatechange=function (){
if(oAjax.readyState==4){
console.log(oAjax)
if(oAjax.status==200){
//alert('成功了:'+oAjax.responseText);
console.log(oAjax)
fnSucc(oAjax.responseText);
}else{
//alert('失败了');
if(fnFaild){
fnFaild();
}
}
}
};
onreadystatechange 是一个事件句柄。它的值 (state_Change) 是一个函数的名称,当 XMLHttpRequest 对象的状态发生改变时,会触发此函数。状态从 0 (uninitialized) 到 4 (complete) 进行变化。仅在状态为 4 时,我们才执行代码。
fetch('http://localhost:3000/api/data', {
method:'GET',
headers: { // 请求头(可以是Headers对象,也可是JSON对象)
'Content-Type': 'application/json',
'Accept': 'application/json'
},
mode:'cors',// 允许发送跨域请求
credentials: 'include'
}).then(function(response){
//打印返回的json数据
response.json().then(function(data){
console.log(data);
})
}).catch(function(e){
console.log('error: ' + e.toString());
})
1)fetch只对网络请求报错,对400,500都当做成功的请求,需要封装去处理
2)fetch默认不会带cookie,需要添加配置项
3)fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费
4)fetch没有办法原生监测请求的进度,而XHR可以
ajax和fetch在调用本地文件的时候都存在跨域的问题;ajax可以通过关闭cors限制的chrome实现;fetch却不行,只能用express起本地服务来调用。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!