Fetch API更加现代

XHR 和 Fetch API 最显著的区别就是调用方式不同。这一点大家应该都知道吧。

举个例子,下面两端代码完成的是同一功能:

// 用 XHR 发起一个GET请求
var xhr = new XHMHttpRequest(); xhr.open('GET', url); xhr.responseType = 'json'; xhr.onload = function(){ console.log(xhr.response); }; xhr.onerror = function(){ console.log('something wrong~ ╮( ̄▽ ̄)╭'); }; xhr.send(); // 用 Fetch 完成同样的请求 fetch(url).then(function(response){ return response.json(); }).then(function(jsonData){ console.log(jsonData); }).catch(function(){ console.log('something wrong~ ╮( ̄▽ ̄)╭'); });

相比 XHR ,Fetch 结合了现代的编码模式,使用起来更简洁 ,完成工作所需的实际代码量也更少。

Fetch API更底层

其实,刚才说到的 Fetch API 并不是指仅仅一个 fetch 方法,还包括 Request、 Response、Headers、Body都一系列原生对象。对于传统的XHR而言,你必须使用它的一个实例来发出请求和处理响应。 但是通过Fetch API,我们还能够通过刚才提到的原生对象,明确的配置请求和响应。这些底层的抽象让 Fetch API 比 XHR 更灵活。

举个例子,现在要下载一个很大的 utf-8 格式的 txt 文件,我们通过流式的响应体而不是文本的形式读取,最后显示在一个div中。(为什么使用流、使用流有什么好处我就不做过多解释了……)

document.addEventListener('DOMContentLoaded', function(e){ var url = 'Test.txt'; var div = document.getElementById('content'); var progress = 0; var contentLength = 0; fetch(url).then(function(response){ // 通过响应头获取文件大小 contentLength = response.headers.get('Content-Length'); var pump = function(reader){ return reader.read().then(function(result){ // 如果流中的内容读取完毕,result.done的值会变为true if (!result.done) { // 获取流中的数据 var chunk = result.value; var text = ''; // 流中的数据是一串字节码,需要做转码 for (var i = 3; i < chunk.byteLength; i++) { text += String.fromCharCode(chunk[i]); } // 添加到页面的div中 div.innerHTML += text; // 还可以用流的长度显示当前进度 progress += chunk.byteLength; console.log(((progress / contentLength) * 100) + '%'); // 开始读取下一个流 return pump(reader); } }); } // 开始读取流中的信息 return pump(response.body.getReader()); }) .catch(function(error){ console.log(error); }); });

在上面的例子中,我们不止使用了流来下载文件,还通过响应头获取了响应的具体信息,显示了下载的进度。虽然使用XHR也能做到使用流来读取文件,不过现在应该只有IE浏览器支持。但是 Fetch API 提供了访问数据的实际字节的方法,而 XHR 的 responseText 只有文本形式,这意味着在某些场景下它的作用可能非常有限。

Fetch API更接近未来

当我们在谈论 Fetch API 时,我们在谈论的不止是这些已经胜过 XHR 的地方,更是在谈论 Fetch API未来的可能性。比如未来基于 Fetch 和 Service Worker 的缓存和请求拦截技术。

转载于:https://www.cnblogs.com/lal520/p/10056656.html

fetch与XHR的区别与优势相关推荐

  1. fetch和XHR的区别

    fetch和XHR(XMLHttpRequest)分别是什么? fetch和XHR都是是获取远端数据的方式. fetch是原生js方法,没有使用XMLHttpRequest对象,使用fetch可以不用 ...

  2. fetch 不是xhr_fetch与XHR的区别与优势

    Fetch API更加现代 XHR 和 Fetch API 最显著的区别就是调用方式不同.这一点大家应该都知道吧. 举个例子,下面两端代码完成的是同一功能: // 用 XHR 发起一个GET请求 va ...

  3. 黑苹果适合什么用途?_黑苹果系统,Ozmosis和四叶草、变色龙相比有什么区别和优势?...

    黑苹果单系统,Ozmosis和四叶草.变色龙相比有什么区别和优势? 黑苹果系统用于影视后期处理 ozmosis由于调试灵活性差,每次调试都要刷bios,主板厂商提供的bios也就8mb,要把,ozmo ...

  4. 功率半导体芯片是什么_LED日光灯与传统日光灯之间有什么区别和优势呢?

    光影 光影空间 光影空间--全球领先的LED行业知识共享平台 365天,坚持不懈!只为带给你最新最实用的LED信息 投稿邮箱:3269384076@qq.com 在现代的生活中,灯具的发展越来越好了, ...

  5. gophp解释器_[2020年面试题-PHP 与 golang] .Go 和 PHP 在运行的时候有什么区别和优势...

    原文链接 面试题解析 看你简历里也有用过 Go,Go 和 PHP 在运行的时候有什么区别和优势? 题主原回答: PHP 每个请求进来时都会创建 fpm-worker 进程,从而导致系统并发高时 CPU ...

  6. matlab仿真的优势,新手必看 saber和simulink的区别与优势

    新手必看 saber和simulink的区别与优势 来源:华强电子网 作者:华仔 浏览:569 时间:2016-11-04 16:09 标签: 摘要: 说到电路中的仿真模拟软件,是使用面最广也是最为专 ...

  7. fetch和ajax的区别?

    一.写在前面 今天总结一下fetch和ajax的区别. 二.Ajax ajax的本质就是使用XMLHttpRequest对象来请求数据,下面是简单的原生js实现. function ajax(url, ...

  8. Vue与React两个框架的区别和优势对比

    Vue与React两个框架的区别和优势对比 Vue和React两个JavaScript框架都是当下比较受欢迎的,他们两者之间的区别有哪些,各自的优缺点是什么,本文将为你呈现. 我已经写出了两个几乎一样 ...

  9. ajax与axios使用哪个好,ajax、axios、fetch之间的详细区别以及优缺点

    将jQuery的ajax.axios和fetch作个简单的比较,所谓仁者见仁智者见智,最终使用哪一个仍是自行斟酌javascript 1.jQuery ajax 前端 $.ajax({ type: ' ...

最新文章

  1. 从Java类库看设计模式
  2. 计算机丢失faultrep.dll,faultrep.dll是什么文件?
  3. qt 拖拽 修改大小
  4. 在.net2.0中实现Action和Func方法
  5. oracle TNS: 协议适配器错误 解决办法
  6. python 生成xml文件
  7. [Nginx] – 性能优化 – 配置文件优化
  8. 关于qt中的tr( )函数
  9. java异常处理中的返回值
  10. mysql varchar255 知乎_CHAR与VARCHAR详解
  11. WordPress安装插件提示输入FTP账户信息
  12. 计算机主机前耳机没声音,Win10电脑机箱前面板耳机没声音如何解决【解决方法】...
  13. 教你用illustrator画十二色环
  14. SoftICE初使用
  15. 怎么关闭win10自动更新?我们可以这么做!
  16. 智慧楼宇篇 7 —— BIM,今后一定是趋势
  17. Microsoft Office自制安装指南 —Nusen_Liu
  18. 【ACM】杭电1178:Heritage from father 小心溢出!
  19. matlab安装 runtime错,Win7安装Matlab7.0出错Runtime Error怎么办?
  20. BZOJ 4808 二分图最大点独立集

热门文章

  1. ubuntu在VMware虚拟机安装了后桌面显示问题
  2. Emmet快速编写HTML代码
  3. Zend Framework学习(3)第一个zend应用
  4. C++大师Stan Lippman:我对中国程序员的忠告
  5. c# 的messageBox的各种用法
  6. Pytorch在colab和kaggle中使用TensorBoard/TensorboardX可视化
  7. JVM 内存区域方面的面试题
  8. 推断一个图片是不是伪造的方法
  9. 介绍Angular的注入服务
  10. sharepoint_study_7