ajax和axios、fetch的区别
赵客缦胡缨v吴钩霜雪明 关注
7.9 2018.09.13 17:57 字数 1116 阅读 55399评论 10喜欢 197
1.jQuery ajax
$.ajax({
type: 'POST',
url: url,
data: data,
dataType: dataType,
success: function () {},
error: function () {}
});
传统 Ajax 指的是 XMLHttpRequest(XHR), 最早出现的发送后端请求技术,隶属于原始js中,核心使用XMLHttpRequest对象,多个请求之间如果有先后关系的话,就会出现回调地狱。
JQuery ajax 是对原生XHR的封装,除此以外还增添了对JSONP的支持。经过多年的更新维护,真的已经是非常的方便了,优点无需多言;如果是硬要举出几个缺点,那可能只有:
1.本身是针对MVC的编程,不符合现在前端MVVM的浪潮
2.基于原生的XHR开发,XHR本身的架构不清晰。
3.JQuery整个项目太大,单纯使用ajax却要引入整个JQuery非常的不合理(采取个性化打包的方案又不能享受CDN服务)
4.不符合关注分离(Separation of Concerns)的原则
5.配置和调用方式非常混乱,而且基于事件的异步模型不友好。
PS:MVVM(Model-View-ViewModel), 源自于经典的 Model–View–Controller(MVC)模式。MVVM 的出现促进了 GUI 前端开发与后端业务逻辑的分离,极大地提高了前端开发效率。MVVM 的核心是 ViewModel 层,它就像是一个中转站(value converter),负责转换 Model 中的数据对象来让数据变得更容易管理和使用,该层向上与视图层进行双向数据绑定,向下与 Model 层通过接口请求进行数据交互,起呈上启下作用。View 层展现的不是 Model 层的数据,而是 ViewModel 的数据,由 ViewModel 负责与 Model 层交互,这就完全解耦了 View 层和 Model 层,这个解耦是至关重要的,它是前后端分离方案实施的最重要一环。
如下图所示:
image.png
2.axios
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Vue2.0之后,尤雨溪推荐大家用axios替换JQuery ajax,想必让axios进入了很多人的目光中。
axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范,它本身具有以下特征:
1.从浏览器中创建 XMLHttpRequest
2.支持 Promise API
3.客户端支持防止CSRF
4.提供了一些并发请求的接口(重要,方便了很多的操作)
5.从 node.js 创建 http 请求
6.拦截请求和响应
7.转换请求和响应数据
8.取消请求
9.自动转换JSON数据
PS:防止CSRF:就是让你的每个请求都带一个从cookie中拿到的key, 根据浏览器同源策略,假冒的网站是拿不到你cookie中得key的,这样,后台就可以轻松辨别出这个请求是否是用户在假冒网站上的误导输入,从而采取正确的策略。
3.fetch
try {
let response = await fetch(url);
let data = response.json();
console.log(data);
} catch(e) {
console.log("Oops, error", e);
}
fetch号称是AJAX的替代品,是在ES6出现的,使用了ES6中的promise对象。Fetch是基于promise设计的。Fetch的代码结构比起ajax简单多了,参数有点像jQuery ajax。但是,一定记住fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象。
fetch的优点:
1.符合关注分离,没有将输入、输出和用事件来跟踪的状态混杂在一个对象里
2.更好更方便的写法
坦白说,上面的理由对我来说完全没有什么说服力,因为不管是Jquery还是Axios都已经帮我们把xhr封装的足够好,使用起来也足够方便,为什么我们还要花费大力气去学习fetch?
我认为fetch的优势主要优势就是:
1. 语法简洁,更加语义化
2. 基于标准 Promise 实现,支持 async/await
3. 同构方便,使用 [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch)
4.更加底层,提供的API丰富(request, response)
5.脱离了XHR,是ES规范里新的实现方式
最近在使用fetch的时候,也遇到了不少的问题:
fetch是一个低层次的API,你可以把它考虑成原生的XHR,所以使用起来并不是那么舒服,需要进行封装。
例如:
1)fetch只对网络请求报错,对400,500都当做成功的请求,服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。
2)fetch默认不会带cookie,需要添加配置项: fetch(url, {credentials: 'include'})
3)fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费
4)fetch没有办法原生监测请求的进度,而XHR可以
总结:axios既提供了并发的封装,也没有fetch的各种问题,而且体积也较小,当之无愧现在最应该选用的请求的方式。
您的支持是我前进路上最大的动力,谢谢!
赞赏支持
© 著作权归作者所有
写了 509680 字,被 3159 人关注,获得了 7999 个喜欢
内不欺己,外不欺人,上不欺天。君子所以慎独。
喜欢
197
登录 后发表评论
10条评论 只看作者
按时间倒序按时间正序
8楼 · 2019.06.18 11:58
fetch的兼容性可以直接放弃了
赞 回复
麦勇潮:
可以在koa2中使用
2019.06.18 18:47 回复
添加新评论
7楼 · 2019.05.23 13:03
6666
赞 回复
6楼 · 2019.05.18 13:42
fetch底层还是XMLlHTTPRequest对象啊,只不过包了一层Promise吧
赞 回复
https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch 请不要误人子弟
2019.06.21 14:50 回复
添加新评论
5楼 · 2019.04.24 19:30
多谢,最近在学习vue,正好看到axios,不知道是什么东东
赞 回复
4楼 · 2018.12.13 16:53
手动点赞
2人赞 回复
3楼 · 2018.12.03 17:08
挺好,我一直想对比整理一份的,就是太懒没整理. 要是再加上jsonp就更好了
赞 回复
@情有千千节 可以考虑把jsonp,更新进去
2018.12.03 17:16 回复
@赵客缦胡缨v吴钩霜雪明 关jsonp啥事
2018.12.10 17:31 回复
添加新评论
被以下专题收入,发现更多相似内容
推荐阅读更多精彩内容
如何使用 fetch ,加请求头, ajax 和 fetch 和 axios 的区别
----欢迎查看我的博客---- 什么是fetch 我们之前,过度过来都在用ajax,那么什么是 Fetch ,Fetch 是新的游览器对象, 等同于 XMLHttpRequest对象 。它提供了许多与 XMLHttpRequest 相同的功能,但被设计成更具可扩展性和...
本文将会根据自己的理解,来阐述Ajax, Axios, Fetch他们之间的区别 1 、JQuery ajax Ajax是对原生XHR的封装,为了达到我们跨越的目的,增添了对JSONP的支持。经过这么多年的更新维护,不得不承认它已经很成熟,能够满足我们的基本需求,但是随着r...
小鱼的大白话Axios | Ajax | Await|Async | asyncData | fetch
Axios vs Ajax Axios 基于promise的HTTP库。用在浏览器和node.js中 安装 npm install axois 使用: axios(config) || axios(url[, config]) 特殊使用:执行多个并发请求 API axios...
本文详细介绍了 XMLHttpRequest 相关知识,涉及内容: AJAX、XMLHTTP、XMLHttpRequest详解、XMLHttpRequest Level 1、Level 2 详解 XHR 上传、下载数据、XHR 流式传输、XHR 定时轮询和长轮询区别与优缺点...
semlinker什么是Ajax(Ajax的来历、运行原理、优缺点及其它)
大家好,我是IT修真院深圳分院第3期的学员,一枚正直纯洁善良的前端程序员,今天给大家分享一下,修真院官网前端工程师深度思考中的知识点——什么是Ajax 一.背景介绍 Ajax的来历 套用一句不恰当的话,Ajax就是中间商(并不赚取差价),换一个专业点的说话,现在它就是脚本发...
大大头大古根海姆(Guggenheim Partners)遭调查
2017年11月30日 07:36 英国《金融时报》 詹姆斯•丰塔内拉汗,苏吉特•因达普,乔•伦尼森和卡拉•斯坎内尔 四名记者在纽约报道。 原文链接:http://www.ftchinese.com/story/001075285?full=y 这篇报道叙述了三个事件: 1...
媽媽 我再爱你到永远永远。
Lydiacrown儿子嫌弃乞丐父亲不理,父亲跪在儿家门,父亲的做法让儿子傻了
本故事为弘扬正能量,请读者走心阅读。 故事发生在高新村,小川从小母亲就因病离世了,父亲王富贵一把屎一把尿把他养了这么大,耗费了多少心血。 可是小川却一直嫌弃父亲王富贵,王富贵一直以来没有工作,挣钱的唯一途径就是去乞讨要饭捡破烂,不过你还别说,前十几年捡破烂乞讨还真能赚钱,一...
关于用俯卧撑来锻炼身体,有的人说只有一种,有的人说只能锻炼到胸肌等等。事实上用俯卧撑基本上可以锻炼到全身的肌肉,并且俯卧撑有多种不同的做法,当然锻炼的难度、效果也不同。今天本文要分享的是八种不同俯卧撑的正确做法。 1、一般俯卧撑 这种是大家最常用的俯卧撑,采用双手略宽于肩,...