Fetch()方法介绍

前言

javascript中,所有的代码都是以单线程的方式执行的,因而网络请求,浏览器事件等操作都需要使用异步的方法。

XMLRequest(XHR)

var xhr=new XMLHttpRequest()
   xhr.open('get','/some/url',true)
   xhr.responseType = 'json';
   xhr.send()
   xhr.onreadystatechange=function(){
       if(xhr.status=200&&xhr.readyState==4){
           console.log(xhr.response)
       }
   }

告别XMLHttpRequest

fetch()方法与XMLHttpRequest类似,fetch也可以发起ajax请求,但是与XMLHttpRequest不同的是,fetch方式使用Promise,相比较XMLHttpRequest更加的简洁。

如果你还不了解Promise,需要先补充,关于Promise的一些知识。

Promise

Promise是进行异步操作的一种解决方案,比传统的处理方法(回调函数/处理事件)更加合理,ES6将其写入了语言标准,统一了语法,原生提供了Promise。 Promise可以想象成一个装有各种结果的容器,里面装有某个时间返回来的结果,你可以在需要的时候拿取它并进行一些事件处理。

从上边的介绍,大概可以看出Promise相比较于传统的异步操作的一个优势在于不用在异步操作的同时进行事件的处理,更加的合理性。

使用方法

在ES6中规定,Promise对象是一个构造函数,用来生成Promise实例。

const promist = new Promise(function(resolve,reject){
    if(/*异步操作成功*/){
        resolve(value);
    }else{
        reject(error);
    }
})
  • resolve在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
  • reject在异步操作失败时调用,并将异步操作错误结果,作为参数传递出去
  • Promise实例生成后可以用then()方法操作成功/失败的回调函数
promise.then(function(value){
<!-- 成功的回调处理 -->
},function(error){
<!-- 失败的回调处理 -->
})

基本的fetch请求

简单的了解了Promise后我们就可以对fetch()方法有一个很好的认识了,fetch是全局量window的一个方法,第一个参数为URL。

// url (必须), options (可选)
fetch('/some/url', {
    method: 'get'
}).then(function(response) {

}).catch(function(err) {
    // 出错了;等价于 then 的第二个参数,但这样更好用更直观 :(

});

url参数是必须要填写的,option可选,设置fetch调用时的Request对象,如method、headers等
比较常用的Request对象有:

  • method - 支持 GET, POST, PUT, DELETE, HEAD
  • url - 请求的 URL
  • headers - 对应的 Headers 对象
  • body - 请求参数(JSON.stringify 过的字符串或’name=jim\u0026age=22’ 格式)

如提交JSON示例如下:

fetch('/users.json', {
    method: 'POST', 
    body: JSON.stringify({
        email: 'huang@163.com'
        name: 'jim'
    })

}).then(function() { /* 处理响应 */ });

Response响应

fetch方法的then会接收一个Response实例,值得注意的是fetch方法的第二个then接收的才是后台传过来的真正的数据,一般第一个then对数据进行处理等。

例如fetch处理JSON响应时 回调函数有一个json()方法,可以将原始数据转换为json对象

fetch('/some/url', { method: 'get', })
    // 第一个then  设置请求的格式
        .then(e => e.json())
        // 第二个then 处理回调
        .then((data) => {
         <!-- data为真正数据 -->
    }).catch(e => console.log("Oops, error", e))

使用fetch请求发送cookie

fetch(url,{
credentials:"include"
})

总结

使用fetch方法请求数据更加的简单,语法简洁,数据处理过程更加的清晰,基于Promise实现。

<think>好的,用户想了解Axios和Fetch的详细用法及区别,需要对比它们的优缺点。首先,我需要回忆一下Axios和Fetch的基本概念,然后整理它们的用法差异,接着分析各自的优缺点,最后结合引用内容补充相关信息。 首先,Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js,而Fetch是浏览器原生提供的API,不需要外部库。根据引用[1]和[3],Axios是对Ajax的进一步封装,功能更强大,安全性更好,配置项更丰富。而Fetch作为原生API,可能在某些方面更轻量,但需要手动处理更多细节,比如转换JSON数据。 接下来是用法对比。Axios的用法比较简洁,可以直接使用axios.get()方法,自动转换JSON数据,拦截请求和响应,取消请求等。而Fetch需要手动使用fetch()函数,然后处理响应,例如两次.then()调用,第一次获取响应对象,第二次转换JSON。此外,错误处理方面,Axios能捕获HTTP错误状态码(如404、500),而Fetch只有在网络故障时才会reject,需要手动检查response.ok。 关于优缺点,引用[2]提到Axios功能强大,适合各种项目需求,而Fetch作为原生API可能在现代前端框架中更受青睐,但需要更多配置。引用[3]指出,Ajax(jQuery)不符合MVVM趋势,而Axios和Fetch更适合现代开发。此外,Axios的拦截器、取消请求、超时设置等功能是Fetch需要额外实现的。 可能需要考虑用户的实际使用场景,比如是否需要兼容旧浏览器,项目是否已经使用第三方库,或者是否需要更简洁的代码。同时,根据引用内容,Axios在安全性和配置丰富性上有优势,而Fetch则更轻量,但需要更多手动处理。 最后,生成相关问题时要覆盖用法、区别、优缺点、选择建议和兼容性等方面,帮助用户深入理解两者的适用场景。</think>### Axios vs Fetch: 详细介绍、用法对比以及优缺点分析 #### 一、Axios的核心特性与用法 1. **基本功能** Axios是基于Promise的HTTP客户端,支持浏览器和Node.js环境,提供链式调用和拦截器功能。例如: ```javascript axios.get('/api/data') .then(response => console.log(response.data)) .catch(error => console.error(error)); ``` 2. **自动数据转换** 响应数据默认自动转换为JSON格式,无需手动解析[^1]。 3. **拦截器** 支持请求/响应拦截器,可统一添加身份验证或错误处理逻辑: ```javascript axios.interceptors.request.use(config => { config.headers.Authorization = 'Bearer token'; return config; }); ``` 4. **取消请求** 通过`CancelToken`实现请求取消功能,适用于重复请求或页面跳转场景[^3]。 --- #### 二、Fetch的核心特性与用法 1. **原生API与基本调用** Fetch是浏览器原生API,无需第三方库,返回Promise对象: ```javascript fetch('/api/data') .then(response => { if (!response.ok) throw new Error('请求失败'); return response.json(); }) .then(data => console.log(data)) .catch(error => console.error(error)); ``` 2. **手动数据处理** 需显式调用`.json()`或`.text()`方法解析响应数据。 3. **无默认错误处理** HTTP错误状态码(如404)不会触发`catch`,需通过`response.ok`手动判断[^2]。 --- #### 三、对比与适用场景 | **特性** | **Axios** | **Fetch** | |----------------|----------------------------------------|----------------------------------------| | 数据转换 | 自动转换JSON | 需手动调用`.json()` | | 错误处理 | 自动捕获HTTP错误状态码 | 需手动检查`response.ok` | | 拦截器 | 内置 | 需通过覆盖全局方法模拟 | | 取消请求 | 通过`CancelToken`实现 | 通过`AbortController`实现 | | 浏览器兼容性 | 兼容IE11+ | 兼容现代浏览器(IE需polyfill) | --- #### 四、优缺点总结 1. **Axios优势** - 功能全面(拦截器、取消请求、自动转换) - 统一的错误处理逻辑 - 兼容性更好,支持旧版浏览器 **缺点**:需额外引入第三方库(体积增加约12KB) 2. **Fetch优势** - 原生支持,减少依赖 - 符合现代Web标准,适合新项目[^2] **缺点**:需自行封装常用功能(如超时控制) --- #### 五、选择建议 - **复杂项目**:优先Axios,减少重复代码量 - **轻量级应用**:使用Fetch+AbortController组合 - **框架集成**:Axios在Vue/React社区支持更广泛 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值