封装AJAX(带详细注释)

今天我们进行AJAX的封装,将AJAX进行封装方便我们的使用

javascript 复制代码
    <script>
        //将对象封装为字符串
        function swithStr(obj) {
            let str = ''
            for (k in obj) {
                str += `${k}=${obj[k]}&`
            }
            return str.slice(0, -1)
        }
        function ajax(option = {}) {
            //验证是否传了url url必须传
            if (option.url == undefined) throw new Error('必须传url,不能为空')

            //判断是否传了参数 参数只能穿post get
            if (!(option.method == undefined || /^(POST|GET)$/i.test(option.method)))             throw new Error('参数只能传POST或者GET')

            //判断是否传了异步 传异步参数只能是布尔值或者不填
            if (!(option.async == undefined || typeof option.async == 'boolean')) throw new Error('async参数只能穿布尔类型或者undefined')

            //判断是否传了参数 参数只能穿Object类型的或者不传 //option.data.constructor == Object
            if (!(option.data == undefined || typeof option.data == 'string' || typeof option.data == 'object')) throw new Error('携带的参数只能填对象或者不填')

            //判断是否传了请求头,请求头只能传对象或者不会窜
            if (!(option.header == undefined || typeof option.data == 'object')) throw new Error('请求头只能传对象或者undefined')

            //判断是否需要解析响应体 只能传string或者json
            if (!(option.dataType == undefined || /^(JSON|STRING)$/i.test(option.dataType))) throw new Error('响应体只能传string或者json')


            //准备一套默认值
            const _default = {
                url: option.url,
                method: option.method || 'GET',
                async: option.async ?? true,
                data: option.data || '',
                header: { 'content-type': 'application/x-www-form-urlencoded', ...option.header },
                dataType: option.dataType ?? 'string'
            }
            //如果是GET方式,处理data

            if (typeof option.data == 'object') _default.data = swithStr(option.data)
            if (/^GET$/i.test(_default.method) && _default.data) _default.url += '?' + _default.data

            //创建Promise对象用来处理异步
            const p = new Promise((resolve, reject) => {
                const xhr = new XMLHttpRequest()
                xhr.open(_default.method, _default.url, _default.async)
                xhr.onload = function () {
                    if (_default.dataType == 'string') {
                        resolve({
                            code: 1,
                            message: '成功',
                            info: xhr.responseText
                        })
                    }
                    try {
                        const res = JSON.parse(xhr.responseText)
                        resolve({
                            code: 1,
                            message: '成功',
                            info: res
                        })
                    } catch (err) {
                        resolve({
                            code: 0,
                            message: '失败',
                            info: err
                        })
                    }
                }

                //POST使用请求头
                if (/^POST$/i.test(_default.method)) xhr.setRequestHeader('content-type', _default.header['content-type']);
                //设置token请求头
                if (_default.header.authorization) xhr.setRequestHeader('authorization', _default.header['authorization']);

                //发送请求
                /^post$/i.test(_default.method) ? xhr.send(_default.data) : xhr.send()


            })
            return p
        }



 async function fff() {
            const a = await ajax({ method: 'get', url: 'http://localhost:8888/test/first', async: false })
            console.log(a)
            const b = await ajax({ method: 'get', url: 'http://localhost:8888/test/second', async: false })
            console.log(b)
            const c = await ajax({ method: 'get', url: 'http://localhost:8888/test/third', async: false, data: { name: 'zhangsan', age: 18 } })
            console.log(c)
            const d = await ajax({ method: 'post', url: 'http://localhost:8888/test/fourth', async: false, data: { name: 'zhangsan', age: 18 } })
            console.log(d)

            const e = await ajax({ method: 'post', url: 'http://localhost:8888/users/login', async: true, data: { username: 'admin', password: '123456' } })
            console.log(e)
        }

        fff()

    </script>
相关推荐
电商API_18007905247几秒前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
晓晓莺歌2 分钟前
vue3某一个路由切换,导致所有路由页面均变成空白页
前端·vue.js
Up九五小庞31 分钟前
开源埋点分析平台 ClkLog 本地部署 + Web JS 埋点测试实战--九五小庞
前端·javascript·开源
qq_177767371 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88211 小时前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
天人合一peng4 小时前
Unity中button 和toggle监听事件函数有无参数
前端·unity·游戏引擎
方也_arkling5 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐5 小时前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
web打印社区5 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO5 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素