从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


相关文章
|
12月前
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
这篇文章是关于如何在Vue项目中使用axios进行网络请求、二次封装axios以及使用mockjs模拟响应数据的教程。
348 1
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
|
14天前
|
JavaScript
Vue中Axios网络请求封装-企业最常用封装模式
本教程介绍如何安装并配置 Axios 实例,包含请求与响应拦截器,实现自动携带 Token、错误提示及登录状态管理,适用于 Vue 项目。
30 1
封装axios的get、post方法
本文介绍了如何封装axios的get和post方法,并展示了具体的代码实现,包括使用axios创建实例、设置请求拦截器以及定义get和post函数。
372 2
|
12月前
vue3 + Ts 中 使用 class 封装 axios
【10月更文挑战第8天】
773 1
|
12月前
vue3 + Ts 中 使用 class 封装 axios
【10月更文挑战第5天】
481 1
|
12月前
|
前端开发 JavaScript API
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南
445 0
|
12月前
|
JavaScript API 开发工具
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
vue尚品汇商城项目-day02【11.对axios二次封装+12.接口统一管理】
105 0
|
2月前
|
前端开发 JavaScript API
一文吃透 Promise 与 async/await,异步编程也能如此简单!建议收藏!
在前端开发中,异步编程至关重要。本文详解了同步与异步的区别,通过生活化例子帮助理解。深入讲解了 Promise 的概念、状态及链式调用,并引入 async/await 这一语法糖,使异步代码更清晰易读。还介绍了多个异步任务的组合处理方式,如 Promise.all 与 Promise.race。掌握这些内容,将大幅提升你的异步编程能力,写出更优雅、易维护的代码,助力开发与面试!
165 0
一文吃透 Promise 与 async/await,异步编程也能如此简单!建议收藏!
|
2月前
|
前端开发 JavaScript API
JavaScript异步编程:从Promise到async/await
JavaScript异步编程:从Promise到async/await
376 204
|
11月前
|
前端开发 JavaScript 开发者
Async 和 Await 是基于 Promise 实现
【10月更文挑战第30天】Async和Await是基于Promise实现的语法糖,它们通过简洁的语法形式,借助Promise的异步处理机制,为JavaScript开发者提供了一种更优雅、更易于理解和维护的异步编程方式。
204 1