【ajax核心03】封装底层axios函数

目录

一:步骤总结

二:获取数据需求:

三:查找数据需求:

四:发送数据需求:

一:步骤总结

  1. 定义myAxios函数,接收配置对象,返回Promise对象
  2. 发送XHR请求,设置默认请求方式为GET
  3. 调用成功/失败处理程序
  4. 使用myAxios函数,获取数据
javascript 复制代码
function myAxios(config){
    return new Promise((resolve,reject)=>{
        //XHR请求
        //调用成功/失败的处理程序
    })    
}
myAxios({
}).then(result=>{}).catch(error=>{})

其实底层部分源码框架是这样的,只不过不同的需求,往函数中传入的配置对象有些许不同

二:获取数据需求:

/**

* 目标:封装_简易axios函数_获取省份列表

* 1. 定义myAxios函数,接收配置对象,返回Promise对象

* 2. 发起XHR请求,默认请求方法为GET

* 3. 调用成功/失败的处理程序

* 4. 使用myAxios函数,获取省份列表展示

*/

javascript 复制代码
    //*  1. 定义myAxios函数,接收配置对象,返回Promise对象
    function myAxios(config) {
      return new Promise((resolve, reject) => {
        //*  2. 发起XHR请求,默认请求方法为GET
        const xhr = new XMLHttpRequest()
        xhr.open(config.method || 'GET', config.url)
        xhr.addEventListener('loadend', () => {
          if (xhr.status >= 200 && xhr.status < 300) {
            resolve(JSON.parse(xhr.response))
          } else {
            reject(new Error(xhr.response))
          }
        })
        xhr.send()
      })
    }
    //*  3. 调用成功/失败的处理程序
    myAxios({
      url: 'https://hmajax.itheima.net/api/province1',
    }).then(
      //*  4. 使用myAxios函数,获取省份列表展示
      result => {
        console.log(result);
        document.body.innerHTML = result.list.join('<br>')
      }).catch(error => {

        document.body.innerHTML = error.message
      })

三:查找数据需求:

/**

* 目标:封装_简易axios函数_获取地区列表

* 1. 判断有params选项,携带查询参数(核心)

* 2. 使用URLSearchParams转换,并携带到url上(核心)

* 3. 使用myAxios函数,获取地区列表

*/

javascript 复制代码
 function myAxios(config) {
      return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest()
        if (config.params) {



//核心
          // 2.使用URLSearchParams,将传参对象中的params查询对象进行转化,并携带到url上
          const paramsObj = new URLSearchParams(config.params)
          console.log(paramsObj);
          const queryString = paramsObj.toString()
          //把查询字符串拼接在url?后面
          config.url += `?${queryString}`

//核心
        }
        xhr.open(config.method || 'GET', config.url)
        xhr.addEventListener('loadend', () => {
          if (xhr.status >= 200 && xhr.status < 300) {
            resolve(JSON.parse(xhr.response))
          } else {
            reject(new Error(xhr.response))
          }
        })
        xhr.send()
      })
    }
    myAxios({
      url: "https://hmajax.itheima.net/api/area",
      params: {
        pname: "辽宁省",
        cname: '大连市'
      }
    }).then(result => {
      console.log(result);
      document.body.innerHTML = result.list.join('<br>')
    })

四:发送数据需求:

/**

* 目标:封装_简易axios函数_注册用户

* 1. 判断有data选项,携带请求体

* 2. 转换数据类型,在send中发送

* 3. 使用myAxios函数,完成注册用户

*/

javascript 复制代码
function myAxios(config) {
      return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest()

        if (config.params) {
          const paramsObj = new URLSearchParams(config.params)
          const queryString = paramsObj.toString()
          config.url += `?${queryString}`
        }
        xhr.open(config.method || 'GET', config.url)

        xhr.addEventListener('loadend', () => {
          if (xhr.status >= 200 && xhr.status < 300) {
            resolve(JSON.parse(xhr.response))
          } else {
            reject(new Error(xhr.response))
          }
        })

//发送数据需求
        if (config.data) {
          xhr.setRequestHeader('Content-Type', 'application/json')
          //2.转换数据类型,将data中的对象转换为json字符串,在send中发送
          const jsonStr = JSON.stringify(config.data)
          xhr.send(jsonStr)
        } else {
          xhr.send()
        }
      })
    }
//发送数据需求
    document.querySelector('.reg-btn').addEventListener('click', () => {
      myAxios({
        url: 'https://hmajax.itheima.net/api/register',
        method: 'post',
        data: {
          username: 'itheima9999',
          password: '123456'
        }
      }).then(result => {
        console.log(result);
      }).catch(error => {
        console.log(error);
      })
    })
相关推荐
爱学习的程序媛1 小时前
【Web前端】JavaScript设计模式全解析
前端·javascript·设计模式·web
小码哥_常1 小时前
从SharedPreferences到DataStore:Android存储进化之路
前端
老黑1 小时前
开源工具 AIDA:给 AI 辅助开发加一个数据采集层,让 AI 从错误中自动学习(Glama 3A 认证)
前端·react.js·ai·nodejs·cursor·vibe coding·claude code
薛先生_0991 小时前
js学习语法第一天
开发语言·javascript·学习
jessecyj2 小时前
Spring boot整合quartz方法
java·前端·spring boot
苦瓜小生2 小时前
【前端】|【js手撕】经典高频面试题:手写实现function.call、apply、bind
java·前端·javascript
天若有情6732 小时前
前端HTML精讲03:页面性能优化+懒加载,搞定首屏加速
前端·性能优化·html
踩着两条虫2 小时前
AI驱动的Vue3应用开发平台深入探究(十):物料系统之内置组件库
android·前端·vue.js·人工智能·低代码·系统架构·rxjava
和沐阳学逆向2 小时前
我现在怎么用 CC Switch 管中转站,顺手拿 Codex 举个例子
开发语言·javascript·ecmascript
swipe3 小时前
AI 应用里的 Memory,不是“保存聊天记录”,而是管理上下文预算
前端·llm·agent