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.配置和调用方式非常混乱,而且基于事件的异步模型不友好。
axios
axios({
method: 'post',
url: '/user/12345',
data: {
firstName: '李',
lastName: '雅奇'
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
axios
是一个基于Promise
用于浏览器和nodejs
的 HTTP
客户端,本质上也是对原生XHR
的封装,只不过它是Promise
的实现版本,符合最新的ES
规范,它本身具有以下特征:
1. 从浏览器中创建 XMLHttpRequest
2. 支持 Promise API
3. 客户端支持防止CSRF
4. 提供了一些并发请求的接口(重要,方便了很多的操作)
5. 从 node.js 创建 http 请求
6. 拦截请求和响应
7. 转换请求和响应数据
8. 取消请求
9. 自动转换JSON数据
fetch
fetch('http://example.com/movies.json')
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson);
});
一、fetch优势:
1. 语法简洁,更加语义化
2. 基于标准 Promise 实现,支持 async/await
3. 同构方便,使用 isomorphic-fetch
4. 更加底层,提供的API丰富(request, response)
5. 脱离了XHR,是ES规范里新的实现方式
二、fetch存在问题
1. fetch是一个低层次的API,你可以把它考虑成原生的XHR,所以使用起来并不是那么舒服,需要进行封装。
2. fetch只对网络请求报错,对400,500都当做成功的请求,服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。
3. fetch默认不会带cookie,需要添加配置项: fetch(url, {credentials: 'include'})
4. fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费
5. fetch没有办法原生监测请求的进度,而XHR可以