promise 的ajax 封装

发布于 2022-09-11 19:13:30 字数 1374 浏览 16 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜`诱少女 2022-09-18 19:13:30

下面两行为什么 get 时 没有 是没有必要吗

这里的 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 都是有能力进行解析的。

为什么用encodeURIComponent 可以直接写吗

不能,如果内容中有 url 特殊符号就会出问题,比如 & ? = 直接放到 url 里面会导致提前闭合解析错误。而且空格,中文,emoji 这些都有可能造成不可预知的错误。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文