在Fetch出现之前我们发送异步请求默认都是通过ajax,底层使用了宿主环境的(XHR)XMLHTTPRequest 对象来实现异步请求。实现代码如下:

var xhr = new XMLHttpRequest();
xhr.open("get","example.php", true);
xhr.send(null);
xhr.onreadystatechange = function(){if(xhr.readyState === 4){if(xhr.status == 200){alert(xhr.responseText);}}
}

当然我们一般会用一些封装过的ajax实现解决传统方式的繁琐写法以及xhr低版本浏览器可能出现的兼容问题,比如jquery的ajax:

$.ajax({url: 'example.asp',type: 'get',success: function(){}
})

Fetch API 提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应。它还提供了一个全局 fetch()方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。
fetch的基本用法

fetch('http://example.com/movies.json').then(function(response) {return response}).then(function(response) {console.log(response);});

是不是看上去和jquery以及一些流行的框架的http库很相似。但是你不要忘了,fetch是浏览器原生支持的,使用fetch可以不用引用http的类库即可实现。fetch默认返回 一个promise对象。非支持async 和await,使用它可以更加简洁的编写我们的http请求逻辑。

注意点:
1.fetch是有兼容问题的
IE系列是完全不支持的,主流浏览器的早起版本也不支持,所以如果在项目中使用需要做兼容方案处理。
2.fetch 不管请求处理成功还是失败,都会触发promise的resolve状态回掉。这个和传统的ajax 框架是有点区别的。fetch只有当网络故障导致请求发送失败或者跨域的时候才会触发reject的逻辑。我们可以通过response 对象的ok是否是true来判断是否是真正的成功。

fetch('flowers.jpg').then(function(response) {if(response.ok) {return response.blob();}throw new Error('Network response was not ok.');
}).then(function(myBlob) { var objectURL = URL.createObjectURL(myBlob); myImage.src = objectURL;
}).catch(function(error) {console.log('There has been a problem with your fetch operation: ', error.message);
});

3.fetch配置请求是否携带cookie和接受服务端写入cookie是通过设置credentials

// 所有情况都携带cookie
fetch('https://example.com', {credentials: 'include'
})
// 目前改为默认是same-origin
// 同源的情况下带cookie
fetch('https://example.com', {credentials: 'same-origin'
})
// 忽略cookie
fetch('https://example.com', {credentials: 'omit'
})

4.fetch不想xhr可以原生支持异步请求,fetch因为默认是一个promise的对象。所以如果想用同步的写法,可以借助async await 来实现。

async function getInfo(){const res = await fetch('http://www.test.asp');const result = await res;return result;
}

Fetch更多参数

fetch(url, {body: JSON.stringify(data), // must match 'Content-Type' headercache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cachedcredentials: 'same-origin', // include, same-origin, *omitheaders: {'user-agent': 'Mozilla/4.0 MDN Example','content-type': 'application/json'},method: 'POST', // *GET, POST, PUT, DELETE, etc.mode: 'cors', // no-cors, cors, *same-originredirect: 'follow', // manual, *follow, errorreferrer: 'no-referrer', // *client, no-referrer})

需要注意的是,该语法是比较新的用法,浏览器的支持可能会随着升级产生一些变化。所以切记做好兼容探测处理。避免意外出现。

XHR 和 Fetch 的使用详解和区别总结相关推荐

  1. Node.js中package.json中库的版本号详解(^和~区别)

    Node.js中package.json中库的版本号详解(^和~区别) 当我们查看package.json中已安装的库的时候,会发现他们的版本号之前都会加一个符号,有的是插入符号(^),有的是波浪符号 ...

  2. ViewPager 的适配器 PagerAdapter 、FragmentPagerAdapter与FragmentStatePagerAdapter使用详解与区别

    1.FragmentPagerAdapter与FragmentStatePagerAdapter使用详解与区别

  3. 【Java-Java集合】Java集合详解与区别

    [Java-Java集合]Java集合详解与区别 1)概述 2)集合框架图 2.1.总框架图 2.2.Iterable 框架图 2.3.Map 框架图 3)List 3.1.ArrayList 类继承 ...

  4. Sql Server 中 GAM、SGAM、PAM、IAM、DCM 和 BCM 的详解与区别

    Sql Server 中 GAM.SGAM.PAM.IAM.DCM 和 BCM 的详解与区别 GAM.SGAM.PAM.IAM.DCM 和 BCM 都是 SQL Server 中用来管理空间分配的一些 ...

  5. c语言运算符 amp 的意思,C++中运算符 amp;和amp;amp;、|和|| 的详解及区别

    C++中运算符 &和&&.|和|| 的详解及区别 简介: &&是逻辑与运算符,||是逻辑或运算符,都是逻辑运算符,两边只能是bool类型 &与| 既可以 ...

  6. cpu二级缓存和一级缓存详解及区别(图解)

    cpu二级缓存和一级缓存详解及区别(图解) 2012-09-02 12:27:55|  分类: 硬件技术 |字号 订阅 处理器缓存的传输速率确实很高,然而还不足以取代内存的地位,这主要是由于缓存只是内 ...

  7. Java创建comparator对象,Java Comparable 和 Comparator 的详解及区别

    Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. C ...

  8. MySQL存储引擎InnoDB、MyISAM和MEMORY介绍详解和区别

    文章目录 MySQL存储引擎InnoDB.MyISAM和MEMORY介绍详解和区别 InnoDB存储引擎 特点 操作示例 创建InnoDB表 修改表引擎为InnoDB MyISAM存储引擎 特点 操作 ...

  9. mysql左连接和内连接区别_MYSQL 左连接右连接和内连接的详解及区别

    MYSQL 左连接右连接和内连接的区别,这里就对这些概念经过一个实例,讲解清楚. 代码如下: drop table table1; CREATE TABLE `andrew`.`table1` ( ` ...

  10. 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,它负责任务的调度,资源的分配和管理,统领整个计算机硬件:应用程序是具有某种功能的程序,程序是运行 ...

最新文章

  1. SparkStreaming读取Socket数据
  2. CF888G XOR-MST 最小异或生成树
  3. Android 秒级编译FreeLine
  4. hadoop jar包_【大数据学习】Hadoop的MR分布式开发小实战
  5. java部署到服务器乱码_java web项目发布到linux服务器上运行出现乱码
  6. java oracle数据备份_Java后台备份oracle数据库脚本
  7. 4个你未必知道的内存小知识
  8. [MySQL FAQ]系列 -- Linux命令行下快速监控mysql
  9. 性能测试--jmeter的参数类型【5】
  10. 红帽子 linux启动盘,红帽子Red Hat Linux 9 光盘启动安装过程图解
  11. java 清除文本框数据_Java 添加、读取、删除Excel文本框
  12. CSP认证-201809-1-卖菜
  13. java 获取年和季度_java获取当前时间的年周月季度等的开始结束时间
  14. 饥荒控制台输入没用_饥荒联机版代码为什么没效 怎么用怎么输入
  15. Elasticsearch:《大数据集群学习笔记与实战》之es集群(2)es基本操作
  16. rpcx服务框架浅析13-远程调用
  17. 【西电—英美国家概况(英美概况/英美文化)2023第一学期】第六章参考课后答案
  18. 记录一次公司点星PBX(DotAsterisk) 映射外网后外部SIP分机注册拨通无声音的故障解决方法
  19. 一款原型设计工具“墨刀”的介绍
  20. win10系统怎么安装显卡驱动,驱动人生详细教程

热门文章

  1. Qt如何调用xlsl的方法!
  2. 数位板的主要参数解析
  3. 坐标系的旋转与欧拉角
  4. 《Python股票量化交易从入门到实践》学习记录
  5. 越狱后如何添加cydia源及cydia源大全
  6. 一元四次方程的求根公式
  7. 2018网易编程射击游戏
  8. 如何去掉word文档右侧的竖线
  9. 第一行代码读书笔记___3章
  10. 可视化布局html5