首页 > 试题广场 >

Fetch和Ajax比有什么优缺点?

[问答题]
Ajax
//ajax-get:
var xhr = new XMLHttpRequest();
//请求行
xhr.open('get','./get.php?key1=val1&key2=val2');
//请求头
xhr.setRequestHeader('content-Type','text/html');
//请求主体
xhr.send(null);
xhr.onreadystatechange = function(){
  if(xhr.readyState == 4 && xhr.status == 200){
    console.log(xhr.responseText);
  }
}

//ajax-post:
var xhr = new XMLHttpRequest();
//请求行
xhr.open('post','./ajax-post.php');
//请求头
xhr.setRequestHeader('content-Type','application/x-www-form-urlencoded');
//请求主体
xhr.send('key1=val1&key2=val2');
xhr.onreadystatechange = function(){
  if(xhr.readyState == 4 && xhr.status == 200){
    console.log(xhr.responseText);
  }
}
优点:兼容性比较好
缺点:容易产生回调地狱

1. Ajax
$.ajax({
  type: "POST",
  url: url,
  data: data,
  dataType: dataType,
  success: function(){},
  error: function(){}
});

优缺点:

  1. 针对后端 MVC 模型编程,与前端框架的 MVVM 风格不符
  2. JQuery整个项目太大,单纯使用Ajax却要引入整个JQuery非常的不合理(采取个性化打包的方案又不能享受CDN服务)
  3. 不符合关注分离思想


2. fetch

fetch("http://localhost:6888/test_get",{
 method:"GET",
  mode:"cors"
}).then(res=>{
  return res.json()
}).then(json=>{
  console.log("获取的结果", json.data)
  return json
}).catch(err={
  console.log("请求错误", err)
})

优点:

  1. 基于promise,支持async、await
  2. 符合关注分离,没有将输入、输出和用事件来跟踪的状态混杂在一个对象里。
  3. 更好更方便的写法。
  4. 更加底层,提供的API丰富(request, response)
  5. 脱离了XHR,是ES规范里新的实现方式。

缺点:

  1. fetch只对网络请求报错,对400,500都当做成功的请求,需要封装去处理
  2. fetch默认不会带cookie,需要添加配置项
  3. 无法进行复杂的IO操作
  4. fetch没有办法原生监测请求的进度
  5. 兼容性不好,IE不支持

3. axios

axios({
  method: "post",
  url:"/user/12345",
  data:{
    firstName:"Fred",
    lastName:"Flintstone"
  }
}).then(function(response){
  console.log(response);
}).catch(function(error){
  console.log(error);
});

优缺点:

  1. 支持 Promise,防止回调地狱
  2. 借助 双重 Cookie 防御” 防止CSRF
  3. 提供了一些并发请求的接口(重要,方便了很多的操作)
  4. 支持node进行io操作
双重 Cookie 防御: 就是将 token 设置在 Cookie 中,在提交请求时提交 Cookie,服务端接收到请求后,再进行对比校验。

编辑于 2022-03-13 19:52:33 回复(0)