12.使用Promise封装Ajax

步骤都差不多,只是新创建了一个Promise对象,成功时调用resolve函数,失败时调用reject函数,然后再将这个promise返回出去

javascript 复制代码
function ajax(options) {
    let promise = new Promise(function (resolve, reject) {
        //创建xhr对象
        const xhr = new XMLHttpRequest();

        //初始化参数的内容
        options = options || {};
        options.type = (options.type || 'GET').toUpperCase();
        options.dataType = options.dataType || 'json';

        //处理参数
        let str = '';
        let params = options.data;
        for (let key in params) {
            str += key + '=' + params[key] + '&'
        }
        //去除最后一个&
        params = str.slice(0, str.length - 1);

        //发起请求
        if (options.type === 'GET') {
            xhr.open('GET', options.url + '?' + params, true);
            xhr.send(null)
        } else if (options.type === 'POST') {
            xhr.open('POST', options.url, true);
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.send(params);
        }

        //接收请求
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                let status = xhr.status
                if (status >= 200 && status < 300) {
                    resolve(xhr.responseText)
                } else {
                    reject(new Error(status))
                }
            }
        }
    })
    return promise
}
相关推荐
Jackson__16 分钟前
聊聊 JS 中的可选链 ?.
前端
前端小崔22 分钟前
前端面试题之ES6保姆级教程
开发语言·前端·javascript·面试·职场和发展·ecmascript·es6
像风一样自由27 分钟前
【001】frida API分类 总览
android·frida
casual_clover27 分钟前
Android 之 kotlin 语言学习笔记四(Android KTX)
android·学习·kotlin
Bug从此不上门31 分钟前
【无标题】
前端·javascript·uni-app·vue
HarderCoder32 分钟前
ByAI:Redux中间件的原理和ts简化实现
前端·redux
贩卖纯净水.35 分钟前
Webpack依赖
前端·webpack·node.js
crary,记忆36 分钟前
微前端 - Module Federation使用完整示例
前端·react·angular
不知几秋42 分钟前
Spring Boot
java·前端·spring boot
程序猿ZhangSir1 小时前
Vue3 项目的基本架构解读
前端·javascript·vue.js