# Fetch 和 ajax 以及 axios 的辨析

前言:闲来无事看掘金,发现自己对于这些异步经常使用的方法经常是 “会使用,知其然而不知其所以然”,故而查阅资料整合一下相关知识点

# Ajax(Asynchronous JavaScript and XML

Ajax 其实更像是一种异步请求模式,注意关键字是模式而不是方法,是基于一种 XMLHttpRequest 的请求,所谓的 XMLHttpRequest 是浏览器提供的一种异步请求方式之一,另一种浏览器提供请求的方式叫做 Fetch ,也就是后面将会进一步提到的 promise 化回调请求。

Ajax 的请求方法如下:

<script type="text/javascript">
    var xmlHttp;
    function createXMLHttpRquest()
    {
      if(window.ActiveXobject)
      {
       xmlHttp=new ActiveXobject("MicrosoftXMLHTTP");
      }
      else if(window.XMLHttpRequest)
      {
        xmlHttp=new XMLHttpRequest();
      }
    }
    function startRequest()
    {
      createXMLHttpRquest();
      xmlHttp.onreadystatechange=handleStateChange;
      xmlHttp.open("GET","response.txt",true);
      xmlHttp.send(null);
    }
    function handleStateChange()
    {
      if(xmlHttp.readyState==4)
      {
        if(xmlHttp.status==200)
        {
          alert("来自服务器的响应:"+xmlHttp.responseText);
        }
      }
    }
 </script>

# Fetch

之前都把 Fetch 误以为成一种 "底层逻辑为调用 ajax 方法的 Api 函数",这句话感觉属于是不懂装懂的典型发言。

首先,我们要明白 Fetch 和 XMLHttpRequest 都是浏览器提供的异步手段,二者都是作为 API 而存在,所以 Fetch 的底层逻辑并不是像传统的 Ajax 那样是基于 XMLHttpRequest 来进行通信的。至于,其底层逻辑具体是什么,我没有做相关了解,大概就是例如 Service Workers 之类的吧...

其次,上文我们提到过 Ajax 实际上是作为一种模式名称而被广而传之,因此,Fetch 和 ajax 可以说是不同层面的两种概念。好比 ajax 是 boss,fetch 只是执行事情的大头兵而已。

重要的是,对比基于 XMLHttpRequest 的请求而言,Fetch 实现了如下优点:

  • 能够更好的实现缓存控制,跨域控制,凭证控制,重定向控制
  • 参考:https://www.infoq.cn/article/nbd3cbcdqezhjxwva26a
  • https://blog.openreplay.com/ajax-battle-xmlhttprequest-vs-the-fetch-api

Fetch 使用方法如下:

fetch("/service", {
  method: "GET",
  signal: controller.signal,
})
  .then((res) => res.json())
  .then((json) => console.log(json))
  .catch((error) => console.error("Error:", error));

# Axios

axios 不是一种新的技术。axios 是一个基于 Promise 用于浏览器和 nodejs 的 HTTP 客户端,本质上也是对原生 XHR 的封装,只不过它是 Promise 的实现版本,符合最新的 ES 规范

包含的特性:

  • 从浏览器中创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

axios 涉及到的知识点太多了,准备另起一章。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

神烦大眼怪 微信支付

微信支付

神烦大眼怪 支付宝

支付宝

神烦大眼怪 贝宝

贝宝