首页 > 其他分享 >Fetch和XHR有什么区别?

Fetch和XHR有什么区别?

时间:2023-12-05 10:12:50浏览次数:25  
标签:响应 请求 xhr 区别 Fetch XHR response fetch

区别:

  1. 原生API vs ES6新增函数:XHR 是浏览器提供的原生API,而 fetch 是 ES6 中新增的全局函数。

  2. 使用对象差异:XHR 使用 XMLHttpRequest 对象,而 fetch 使用 Promise 对象。

  3. Cookies 默认携带:fetch 默认不会携带 cookies,需要手动设置 credentials 属性;而 XHR 请求会自动携带 cookies。

  4. 请求取消能力:XHR 可以取消一个正在进行的请求,而 fetch 目前没有原生的请求取消机制。

  5. 响应类型处理:XHR 的 responseType 属性可以设置响应类型(text、json、blob 等),而 fetch 需要手动解析响应。

  6. 进度监听功能:XHR 可以监听上传和下载的进度,而 fetch 不支持此功能。

  7. 错误处理方式:在错误处理方面,fetch 只会在网络错误时 reject Promise,其他错误都会被视为成功的响应,需要手动判断;而 XHR 则会在出现错误时 reject Promise。

  8. 兼容性:XHR 兼容性更好,在一些旧版本的浏览器中可能无法使用 fetch。

代码示例:

使用 XHR 发送 GET 请求:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var response = JSON.parse(xhr.responseText);
        console.log(response);
    }
};
xhr.send();

一些解释:

xhr.open的第三个参数是用于指示请求是否为异步的布尔值。
如果将它设置为 true,则表示该请求是异步的,JavaScript 会在请求发送后继续执行并等待响应。
如果设置为 false,则表示该请求是同步的,JavaScript 会在发送请求后一直等待直到收到响应为止。


XMLHttpRequest 对象的 readyState 属性表示请求的状态,status 属性表示 HTTP 状态
readyState 的可能取值包括:
0: 未初始化,尚未调用 open 方法
1: 启动,已经调用 open 方法,但尚未调用 send 方法
2: 发送,已经调用 send 方法,但尚未接收到响应
3: 接收,已经接收到部分数据
4: 完成,已经接收到全部数据,并且可以在客户端使用
status 的可能取值包括(部分常见的):
200: 请求成功
404: 未找到页面
500: 服务器内部错误
302: 重定向等


使用 fetch 发送 GET 请求:

fetch('https://api.example.com/data')
    .then(function(response) {
        if (response.ok) {
            return response.json();
        } else {
            throw new Error('Network response was not ok.');
        }
    })
    .then(function(data) {
        console.log(data);
    })
    .catch(function(error) {
        console.log(error);
    });

标签:响应,请求,xhr,区别,Fetch,XHR,response,fetch
From: https://www.cnblogs.com/crispyChicken/p/17876588.html

相关文章

  • Unity DOTS系列之托管/非托管Component的区别与性能分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面托管与非托管Component的区别与性能分析,方便大家上手学习掌握UnityDOTS开发。托管与非托管的区别在于是不是基于自动垃圾回收的。托管是由垃圾回收器来负责自动回收,非托管需要我们手动来做相关内存管理,不被垃圾回收系统来处理。......
  • c++传参时 值传递和引用传递的区别
    值传递需要开辟存储空间并拷贝这个对象,引用传递只是给这个对象起了一个别名,不涉及开辟空间和拷贝操作,引用传递更高效值传递在调用函数中修改的不是原来的对象,而引用传递在调用函数中就能直接修改原来的对象举个例子体会一下:435.无重叠区间贪心算法求解,涉及到排序操作,排序函数......
  • SEO与SEM的区别:搜索引擎优化与搜索引擎营销
    随着互联网的发展,搜索引擎成为人们获取信息、产品和服务的主要途径。为了在竞争激烈的在线市场中脱颖而出,企业需要关注搜索引擎优化(SEO)和搜索引擎营销(SEM)。虽然SEO和SEM都与提升网站在搜索引擎中的可见性有关,但它们之间存在一些关键的区别。1.定义和目标:SEO是通过优化网站结构、内......
  • 什么是Overlay网络?Overlay网络与Underlay网络有什么区别?
    你们好,我的网工朋友。在传统历史阶段,数据中心的网络是以三层架构(核心、汇聚、接入)为基本标准。但是随着技术的发展,不同的厂家有不同的组建方式,比如说在核心层、汇聚层和接入层增加虚拟化技术。不管怎么改变,都没有改变以太网络传输的基本原则,都是需要靠网络地址、物理地址来进行控制......
  • SpringMVC中 @RequestParam 与 @PathVariable 区别
    两者都是用来修饰形参两者都是用来绑定访问路径的参数名、形参名称两者接收URL方式不同@RequestParamhttp://www.example.com/pets?petId=3@Controller@RequestMapping("/pets")@SessionAttributes("pet")publicclassEditPetForm{//...@RequestMapping(me......
  • 京东面试:说说Cookie、Session和Token的区别?
    东子作为目前传统电商三巨头之一(其他还有阿里巴巴和拼多多),其面试题的难度也中规中矩,总体来说没有其他两家面试难度高,当然薪资也没有其他两家薪资高。其中拼多多的薪资最为离谱,尤其是前几年,听说挖同行的开发人员,薪资可以开到原来薪资的两到三倍,真是变态(但是我喜欢)。东子的面试题......
  • 百分号、像素与数值的转换与像素区别
    vue百分值与数值之间转换方法一:lettopValue=Number(this.optionModel.grid[i].top);是尝试把整个字符串转换为数字,包括百分号。如果字符串不能被解析为有效的数字,那么结果将是NaN,在这种情况下,你可能需要添加错误处理代码来处理这种情况如果是40%值的话可以转成0.4......
  • 【Linux 基础】正则表达式 与 通配符 区别
    简短不看版:通配符和正则表达式比较(1)通配符和正则表达式看起来有点像,不能混淆。可以简单的理解为通配符只有*,?,[],{}这4种,而正则表达式复杂多了。(2)*在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表达式中他是重复之前的一个或者多个......
  • 【面试攻略】Oracle中blob和clob的区别及查询修改方法
    大家好,我是小米,欢迎来到小米的技术小屋!今天我们要一起来聊聊一个在面试中常常被问到的问题——“Oracle中Blob和Clob有啥区别,在代码中怎么查询和修改这两个类型的字段里的内容?”别急,跟着小米一步步揭开这个技术的神秘面纱!Blob和Clob是什么?首先,让我们来了解一下Blob和Clob是什么。......
  • 你真的了解HashSet 和HashMap的区别、优缺点、使用场景吗?
     HashSet和HashMap是Java集合框架中的两个常用类,它们都用于存储和管理数据,但在使用方式、功能和性能上有很大的区别。HashSet和HashMap的区别区别一:用途不同HashSet: HashSet是一个基于哈希表的集合,用于存储不重复的元素,它不存储键值对。它实际上是基于HashMap......