从XHR、Promise到手动封装简易axios

简介: 从XHR、Promise到手动封装简易axios

AJAX原理:


利用window的XMLHttpRequest对象与服务器进行通信的技术


axios概念:


axios 是对 XHR 相关代码进行了封装,让我们只关心传递的接口参数


XHR

学习XHR( XMLHttpRequest )的原因:


1-交互简便: 如果静态网站与服务器交互的地方只有一到两处, 且我们希望缩小静态网站的体积, 我们此时就不需要引入axios, 而是利用XHR几行代码就可以进行简便交互了


2-理解axios原理: 通过对XHR的学习, 我们可以对axios有一个很好的理解.


XHR的使用方式:


基础使用:

// 1, 创建XMLHttpRequest对象
const xhr = new XMLHttpRequest()
// 2, 配置请求方法和URL地址
xhr.open('请求方法', '请求url网址')
// 3, 监听 loadend 事件, 接收响应结果
xhr.addEventListener('loadend', () => {
  // 响应结果
  console.log(xhr.response)
})
xhr.send()

携带查询参数: 在调用 open 方法的时候,在 url? 后面按照指定格式拼接参数名和值

xhr.open('GET', '<http://hmajax.itheima.net/api/city?pname=辽宁省>')

如何数据提交:


1- 设定XHR


2- 设定提交的数据类型

const xhr = new XMLHttpRequest()
xhr.open('请求方法', '请求url网址')
xhr.addEventListener('loadend', () => {
  console.log(xhr.response)
})
// 1. 告诉服务器,我传递的内容类型,是 JSON 字符串
xhr.setRequestHeader('Content-Type', 'application/json')
// 2. 准备数据并转成 JSON 字符串
const user = { username: 'itheima007', password: '7654321' }
const userStr = JSON.stringify(user)
// 3. 发送请求体数据
xhr.send(userStr)

Promise

Promise概念:


管理一个异步操作最终状态和结果的对象


Promise好处:


逻辑清晰: 异步操作的成功和失败状态会调用对应处理函数


了解 axios 函数内部运作的机制


语法:

// 1. 创建 Promise 对象
const p = new Promise((resolve, reject) => {
 // 2. 执行异步任务-并传递结果
 // 成功调用: resolve(值) 触发 then() 执行
 // 失败调用: reject(值) 触发 catch() 执行
})
// 3. 接收结果
p.then(result => {
 // 成功
}).catch(error => {
 // 失败
})

状态:


Promise对象的状态改变后, 会调用相应的回调函数


待定(pending):初始状态,既没有被兑现,也没有被拒绝


已兑现(fulfilled):操作成功完成


已拒绝(rejected):操作失败

// 1. 创建Promise对象(pending-待定状态)
const p = new Promise((resolve, reject) => {
  // Promise对象创建时,这里的代码都会执行了
  // 2. 执行异步代码
  setTimeout(() => {
    // resolve() => 'fulfilled状态-已兑现' => then()
    resolve('模拟AJAX请求-成功结果')
    // reject() => 'rejected状态-已拒绝' => catch()
    reject(new Error('模拟AJAX请求-失败结果'))
  }, 2000)
})
console.log(p)
// 3. 获取结果
p.then(result => {
  console.log(result)
}).catch(error => {
  console.log(error)
})

输出结果:

Promise
[[Prototype]]: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: "模拟AJAX请求-成功结果"

封装简易axios

需求:基于 Promise 和 XHR 封装 myAxios 函数


语法:

实现步骤:


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

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

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

4.使用 myAxios 函数

function myAxios(config) {
  return new Promise((resolve, reject) => {
    // XHR 请求
    // 调用成功/失败的处理程序
  })
}
myAxios({
  url: '目标资源地址'
}).then(result => {
}).catch(error => {
})

案例:

// 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', () => {
      // 3. 调用成功/失败的处理程序
      if (xhr.status >= 200 && xhr.status < 300) {
        resolve(JSON.parse(xhr.response))
      } else {
        reject(new Error(xhr.response))
      }
    })
    xhr.send()
  })
}
// 4. 使用myAxios函数,获取省份列表展示
myAxios({
  url: '<http://hmajax.itheima.net/api/province>'
}).then(result => {
  console.log(result)
  document.querySelector('.my-p').innerHTML = result.list.join('<br>')
}).catch(error => {
  console.log(error)
  document.querySelector('.my-p').innerHTML = error.message
})


参考: AJAX-Day01-01.AJAX入门与axios使用_哔哩哔哩_bilibili


相关文章
|
2月前
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
这篇文章是关于如何在Vue项目中使用axios进行网络请求、二次封装axios以及使用mockjs模拟响应数据的教程。
85 1
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
|
3月前
封装axios的get、post方法
本文介绍了如何封装axios的get和post方法,并展示了具体的代码实现,包括使用axios创建实例、设置请求拦截器以及定义get和post函数。
117 2
|
2月前
vue3 + Ts 中 使用 class 封装 axios
【10月更文挑战第8天】
132 1
|
2月前
vue3 + Ts 中 使用 class 封装 axios
【10月更文挑战第5天】
154 1
|
2月前
|
前端开发 JavaScript API
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
79 0
|
2月前
|
JavaScript API 开发工具
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
35 0
|
4月前
|
JSON JavaScript 前端开发
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
这篇文章讨论了在Vue项目中封装axios的最佳实践,包括设置接口请求前缀、请求头、状态码、请求方法的封装,以及如何使用请求和响应拦截器来处理token和响应状态,从而简化HTTP请求的配置和错误处理,提高代码的可维护性。
【Vue面试题二十四】、Vue项目中有封装过axios吗?主要是封装哪方面的?
|
2月前
|
资源调度 JavaScript
|
4月前
|
JavaScript 前端开发
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
这篇文章主要讨论了axios的使用、原理以及源码分析。 文章中首先回顾了axios的基本用法,包括发送请求、请求拦截器和响应拦截器的使用,以及如何取消请求。接着,作者实现了一个简易版的axios,包括构造函数、请求方法、拦截器的实现等。最后,文章对axios的源码进行了分析,包括目录结构、核心文件axios.js的内容,以及axios实例化过程中的配置合并、拦截器的使用等。
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
|
2月前
|
缓存 JavaScript 搜索推荐