浅析 XMLHttPRequest API与Fetch API
本文于446天之前发表,文中内容可能已经过时。如有疑问,欢迎在github中给我留言(用户名:zhangyan123)。
WHAT
XMLHttpRequest与Fetch是两个实现客户端与服务器之间实现数据通信的API(由浏览器提供),他们以这样的顺序排放体现了js异步通信的进化。总之,就是两个发异步请求的工具。
- 我们知道Ajax的出现更新了世人对js编程本领的认知,js不再是只会弹框而惹人厌小角色,网页局部更新的实现令前端工程师振奋,哪里要变点哪里,so easy!
- 以往我们谈及Ajax使用的API都是XMLHttpRequest,这是一个以XML开头的单词,但是传输的格式不止于XML,目前使用较多的是JSON,HTML,或纯文本。
- IE5,IE6没有在他们的脚本语言中定义XMLHttpRequest对象的标识符,当时IE5,IE6发布时,XMLHttpRequest标识符本身还不是一个标准。如果XMLHttpRequest标识符不存在,通过对象检测可以获得向后兼容性。微软在2006年发布的IE7时,定义了XMLHttpRequest对象标识符。
- 随着跨浏览器JS库(例如jQuery)流行,开发者再调用XMLHttpRequest功能时不用再直接接触底层API。
- 先来看看直接使用XHR对象发请求的示例
|
|
封装之后:
|
|
以上简单介绍了一个简单的异步请求。
WHY
通过前面的演示我们看到发送一个异步请求有很多方式,那么为什么非要用fetch取代XHR呢?多大仇?
不想说起promise的,但是不讲Promise就讲不下去了。。。
promise的出现是为了解决回调地狱
简化~
思考:假如func3执行的条件是func1和func2均执行完毕,其中func1和fun2均是异步请求,异步请求不确定什么时候结束。。。要么就定个定时器循环检测全局flag是否赋值,要么就是放进回调耦合在一起。
|
|
|
|
HOW
参考:
问题:
- 使用标准的ES6 Promise你无法收集进入信息或中断请求。
- 使用XMLHttpRequest你可以模拟进度(监听progress事件),也可以取消请求(使用abort()方法)。 但是,如果有必要你也可以使用Promise来包裹它。
- 目前Chrome 42+, Opera 29+, 和Firefox 39+都支持Fetch。微软也考虑在未来的版本中支持Fetch。 讽刺的是,当IE浏览器终于微响应实现了progress事件的时候,XMLHttpRequest也走到了尽头。 目前,如果你需要支持IE的话,你需要使用一个polyfill库。