react native

Ajax, Axios, Fetch区别

2018-09-12  本文已影响856人  小鱼的大白话

本文将会根据自己的理解,来阐述Ajax, Axios, Fetch他们之间的区别

1 、JQuery ajax

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

Ajax是对原生XHR的封装,为了达到我们跨越的目的,增添了对JSONP的支持。经过这么多年的更新维护,不得不承认它已经很成熟,能够满足我们的基本需求,但是随着react,vue新一代框架的兴起,以及ES规范的完善,更多API的更新,它逐渐暴露了自己的不足

2 、Axios

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

Vue2.0之后,自从尤雨溪推荐大家用axios替换JQuery ajax,Axios快速的得到大家的关注。Axios本质就是对原生XHR的封装,增加了Promise的实,符合最新的ES规范,从它的官网上可以看到它有以下几条特性:

Axios既提供了并发的封装,体积也较小,也没有下文会提到的fetch的各种问题,当之无愧是现在最应该选用的请求的方式。

3、 Fetch

fetch号称是AJAX的替代品,fetch是基于原生的XMLHttpRequest对象来实现数据请求的,同时也是基于Promise实现链式调用的。它的好处在《传统 Ajax 已死,Fetch 永生》中提到有以下几点:

try {
  let response = await fetch(url);
  let data = await response.json();
  console.log(data);
} catch(e) {
  console.log("error:", e);
}

使用 await 后,告别面条式调用,将异步写成同步,身心舒畅。从上图可以看到await 后面可以跟 Promise 对象,表示等待 Promise resolve() 才会继续向下执行,如果 Promise 被 reject() 或抛出异常则会被外面的 try...catch 捕获。

坦白说,Jquery还是Axios都已经将xhr封装的足够好,使用起来也足够方便,但是Fetch还是得到很多开发者的认可,说明它还是存在很多优势的:

fetch('/testPost', {
    method: 'post',
    mode: 'no-cors',
    data: {}
}).then(function() {});

但是在使用fetch的时候,也会遇到了一些问题:

PS: fetch的具体问题大家可以参考:《fetch没有你想象的那么美》《fetch使用的常见问题及解决方法



xhr+promise的实现原理如下:
function Promise(fn) { 
  this.resolveFn = null; 
  this.rejectFn = null; 
  var _this = this; 
  function resolve(data) { 
    var f = _this.resolveFn; 
    f(data);
 }
  function reject(err) { 
    var f = this.rejectFn;
     f(err); 
 } 
  fn(resolve,reject);
}
Promise.prototype.then = function (f) { 
  this.resolveFn = f; return this; 
}; 
Promise.prototype.catch = function (f) { 
  this.rejectFn = f; return this; 
}; 
function ajax(url,suc,fail) { 
  var xhr = new XMLHttpRequest(); 
  xhr.open('GET',url, true); 
  xhr.onreadystatechange = function () { 
    if(xhr.readyState == 4){
      if(xhr.status == 200){ 
        suc(xhr.responseText) 
      } else { 
        console.log(err); 
        fail(xhr.responseText); 
    }
 } 
};
  xhr.send(null); 
} 
function fetch(url) { 
  console.log('fetch start') 
  return new Promise(function (resolve,reject) { 
    ajax(url,function (res) { 
      resolve(res); 
    },function (err) { 
      console.log(err);
      reject(err); 
    }) 
  }) 
} 

fetch('/test').then(function (res) { 
  console.log(JSON.parse(res)); 
}).catch (function (err) { 
  console.log(err); 
}) 
上一篇下一篇

猜你喜欢

热点阅读