手搓ajax的封装

ajax的封装

前言

每一次发送请求我们都需要重复创建实例,配置请求 发送请求 获取数据,为了能够使用更加方便,我们对于ajax请求的步骤进行封装

同步的ajax请求

  • 同步封装ajax请求可以通过返回值的方式返回后端的数据
  • 请求参数
    • type 请求方式
    • url 请求路径
    • data 发送的数据
  • 返回值
    • 需要将后端的数据返回
js 复制代码
    function ajax(type, url, data){
        const xhr = new XMLHttpRequest
        if(type === 'get'){
            // get请求参数拼接在地址栏后面
            xhr.open(type, url+data, false)
            xhr.send()
        }else{
            // post请求参数放在send函数里面
            xhr.open(type, url, false)
            // 设置请求头
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
            // 去除前面的?
            xhr.send(data.slice(1))
        }
        return xhr.responseText
    }
    // 调用
    let res = ajax('get', 'http://localhost:8888/test/third', '?name=jack&age=18')
    console.log(res)
    let res2 = ajax('post', 'http://localhost:8888/test/fourth', '?name=jack&age=18')
    console.log(res2)

异步的ajax请求

  • 异步封装ajax请求无法通过返回值的方式返回后端的数据,需要借助回调函数的方式返回后端的数据
  • 请求参数
    • type 请求方式
    • url 请求路径
    • data 发送的数据
    • success 请求成功之后执行的回调函数
  • 返回值
    • 无返回值
js 复制代码
    function ajax(type, url, data, success){
        const xhr = new XMLHttpRequest
        if(type === 'get'){
            // get请求参数拼接在地址栏后面
            xhr.open(type, url+data, true)
            xhr.send()
        }else{
            // post请求参数放在send函数里面
            xhr.open(type, url, true)
            // 设置请求头
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
            // 去除前面的?
            xhr.send(data.slice(1))
        }
        xhr.onload = function(){
            // 调用回调函数返回后端的数据
            success(xhr.responseText)
        }
    }
    // 调用
    ajax('get', 'http://localhost:8888/test/third', '?name=jack&age=18', function(res){
        console.log(res)
    })
        
    ajax('post', 'http://localhost:8888/test/fourth', '?name=jack&age=18', function(res){
        console.log(res)
    })

请求的参数支持对象

  • 参数为字符串会容易导致出错,传一个对象不会容易出错
js 复制代码
    function ajax(type, url, data, success){
        const xhr = new XMLHttpRequest
        if(Object.prototype.toString.call(data) === '[object Object]'){
            let str = '?'
            for(let key in data){
                str += `${key}=${data[key]}&`
            }
            data = str.slice(0,-1)
        }
        if(type === 'get'){
            // get请求参数拼接在地址栏后面
            xhr.open(type, url+data, true)
            xhr.send()
        }else{
            // post请求参数放在send函数里面
            xhr.open(type, url, true)
            // 设置请求头
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
            // 去除前面的?
            xhr.send(data.slice(1))
        }
        xhr.onload = function(){
            // 调用回调函数返回后端的数据
            success(xhr.responseText)
        }
    }
    // 调用
    ajax('get', 'http://localhost:8888/test/third', '?name=jack&age=18', function(res){
        console.log(res)
    })
    
    ajax('post', 'http://localhost:8888/test/fourth', '?name=jack&age=18', function(res){
        console.log(res)
    })
    // 调用
    ajax('get', 'http://localhost:8888/test/third', {
        name: 'jack',
        age: 18
    }, function(res){
        console.log(res)
    })
    
    ajax('post', 'http://localhost:8888/test/fourth', {
        name: 'jack',
        age: 18
    }, function(res){
        console.log(res)
    })
        

可省略参数

  • 参数由4个变成一个对象
js 复制代码
    function ajax(params){
        const defaultParams = {
            type: 'get',
            url: '',
            data: {},
            success: function(){

            }
        }
        // 合并默认配置
        const options = {...defaultParams,...params}
        const xhr = new XMLHttpRequest
        if(Object.prototype.toString.call(options.data) === '[object Object]'){
            let str = '?'
            for(let key in options.data){
                str += `${key}=${options.data[key]}&`
            }
            options.data = str.slice(0,-1)
        }
        if(options.type === 'get'){
            // get请求参数拼接在地址栏后面
            xhr.open(options.type, options.url+options.data, true)
            xhr.send()
        }else{
            // post请求参数放在send函数里面
            xhr.open(options.type, options.url, true)
            // 设置请求头
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
            // 去除前面的?
            xhr.send(options.data.slice(1))
        }
        xhr.onload = function(){
            // 调用回调函数返回后端的数据
            options.success(xhr.responseText)
        }
    }
    // 调用
    ajax({
        type: 'get',
        url: 'http://localhost:8888/test/third',
        data: {
            name: 'jack',
            age: 18
        },
        success: function(res){
            console.log(res)
        }
    })
    ajax({
        url: 'http://localhost:8888/test/third',
        data: {
            name: 'jack',
            age: 18
        },
        success: function(res){
            console.log(res)
        }
    })
    ajax({
        url: 'http://localhost:8888/test/second',
        success: function(res){
            console.log(res)
        }
    })
相关推荐
2501_920931705 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
0思必得06 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5167 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino7 小时前
图片、文件的预览
前端·javascript
2501_920931708 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05289 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔9 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李9 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN9 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒9 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局