promise 的ajax 封装
let ajax = (obj) => {
return new Promise((resolve, reject) => {
let method = obj.method || 'GET';
let xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
xhr.onReadyStateChange = () => {
if (xhr.readyState == 4) {
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
resolve(xhr.responseText);
} else {
reject(xhr.statusText);
}
}
}
if (method == 'POST') {
xhr.open('POST', obj.url, true);
// =================下面两行为什么 get 时 没有 是没有必要吗?
xhr.responseType = "json";
xhr.setRequestHeader("Accept", "application/json");
xhr.send(obj.data);
} else {
let query = '';
for (let key in obj.data) {
//================================为什么用encodeURIComponent 可以直接写吗
query += '&' + encodeURIComponent(key) + "=" + encodeURIComponent(obj.data[key]);
}
query.substring(1);
xhr.open('GET', obj.url + '?' + query, true);
xhr.send();
}
})
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这里的
xhr.setRequestHeader("Accept", "application/json")
貌似有问题,应该是("Content-Type", "application/json")
才对吧?这里如果要直接 send 一个 js object 的话,是需要设定内容类型(Content-Type)的,毕竟这里不是作为 form 在发。whatever,get 请求可以根据 url 后缀告诉后端合法的返回格式,比如
api.json
返回 json 、image.jpg
返回 jpg。作为一个接口,前后端应该也会约定具体的accept
类型。而且无论accept
plaintext 还是 json,js 都是有能力进行解析的。不能,如果内容中有 url 特殊符号就会出问题,比如
&
?
=
直接放到 url 里面会导致提前闭合解析错误。而且空格,中文,emoji 这些都有可能造成不可预知的错误。