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

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 的缓存和请求拦截技术。

GIT&lpar;6&rpar;----fork和clone的区别,fetch与pull的区别

参考资料: [1].Git学习笔记:fork和clone的区别,fetch与pull的区别 [2].在Github和Git上fork之简单指南

ajax、axios、fetch之间的详细区别以及优缺点

1.jQuery ajax $.ajax({ type: 'POST', url: url, data: data, dataType: dataType, success: function () ...

git clone、git pull和git fetch的用法及区别

声明:码字不易,转载请注明出处,欢迎文章下方讨论交流.Git 常用命令速查表 最近在一个学习小组里学习AI的课程,我们所有的学习资料和homework都放在gitlab上.今天一个小队友从gitlab ...

&lbrack;异步请求&rsqb;ajax、axios、fetch之间的详细区别以及优缺点

1.jQuery ajax  $.ajax({ type: 'POST', url: url, data: data, dataType: dataType, success: function () ...

SpringMVC和Struts2的区别及优势

1.SpringMVC和Struts2的区别比较 1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方 ...

【git之】fetch和 pull的区别

Git中从远程的分支获取最新的版本到本地有这样2个命令:1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin master git log ...

git fetch和push的区别

获取fetch的用法 git-fetch用于从另一个reposoitory下载objects和refs. 命令格式为:git fetch … 其中表示远端的仓库路径.git remote add or ...

Vue与REACT两个框架的区别和优势对比

VUE和REACT两个JavaScript框架都是当下比较受欢迎的,他们两者之间的区别有那些,各自的优缺点是什么,本文将为你呈现. 简单介绍 除非你最近一直不关注前端的发展,不然你肯定听说过由Face ...

git fetch和pull的区别

Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge   1 2 3 Git fetch origin master ...

随机推荐

svn cleanup failed问题解决

1.SVN出错 今早过来Update,报如下错误: 再次更新,svn会要求你执行clean up,但执行clean up仍会报错,说有未完的work item,还要求你执行clean up.汗,陷入死 ...

修改tabbar 字体颜色

NSDictionary *seletedTextAttrs = @{NSForegroundColorAttributeName:[UIColor orangeColor]}; 修改tabbar 字 ...

HDU 4825 Xor sum

trie树的异或和问题 本题是一道经典题,使用trie树维护所给出的集合,我们知道等比数列前n项的和比第n+1项小,所以本题可以使用贪心策略,对于每一个询问,我们从高位向低位匹配,寻找最大异或值,向下 ...

python基础知识10---算法

一.递归 程序本身自己调用自己称之为递归,类似于俄罗斯套娃,体现在代码中:用户执行最外(N)层函数,最外侧调用N-1层函数,N-1层函数调用N-2层函数... 利用函数编写如下数列: 斐波那契数列指的 ...

HTML学习笔记08-表格

HTML表格 表格由

标签来定义

Bootstrap&lpar;6&rpar;图标菜单按钮组件

一.小图标组件 Bootstrap 提供了免费的 263 个小图标(数了两次),具体可以参考中文官网的组件链接:http://v3.bootcss.com/components/#glyphicons ...

Django之ORM其他骚操作 执行原生SQl

Django ORM执行原生SQL # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=Non ...

selenium遇到不可编辑input和隐藏input如何赋值

js = 'document.getElementsByName("m:csr_mt_gnccspjclfbxd:bmshldID")[0].type="text&quo ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值