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

前端基础——axios、fetch和xhr来封装请求 指出,fetch使用Promise,但需要手动处理响应,比如检查状态码,转换数据格式。所以封装Axios需要创建实例,配置默认值,添加拦截器,然后导出封装后的方法。Axios是一个基于Promise的第三方库,底层可能使用XHR或Node.js的http模块,而fetch是浏览器原生的API,也是基于Promise的。比如Axios的拦截器配置,fetch的响应处理,XHR的回调封装成Promise。最后,综合各证据的示例代码,分别写出三种方法的封装示例,确保每个步骤都有相应的证据支持,并正确引用来源。 阅读详情

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

【前端网络请求】XHR封装,支持文件上传、进度监控、混合字段传输 通过封装简化调用:通过高阶函数减少重复代码。功能复用:一套代码支持文件上传、进度监控、普通请求。可维护性:模块化设计,各函数职责清晰。如果你需要更强大的功能(如拦截器、自动重试),可以在现有代码基础上扩展。 阅读详情

相关推荐

xhr、ajax、axois、fetch的区别

XMLHttpRequest (XHR)、AJAX、Axios 和 Fetch API 都是用于在不重新加载整个页面的情况下与服务器进行通信的技术和库。它们在处理超时、终止请求、进度反馈等机制上有一些显著的差异。以下是它们的详细比较:

yiguoxiaohai的博客 3525

Axios 简版:XHR 的封装、函数和对象方式的请求、添加过滤器

文章目录简版 Axios目标说明目标1:实现基本请求、及多种调用方法类实例化函数式调用对象式调用添加过滤器附 简版 Axios 目标说明 实现 axios 的函数式调用、对象式调用、拦截器的实现等 目标1:实现基本请求、及多种调用方法 类实例化 如果前端想这么调用的话 首先写个简单的类,把 xhr 封装一下 class MyAxios { constructor() {} request(config) { return new Promise((resolve, re

Lovely Ruby 的手账 1414

【BigWorld 游戏服务器引擎】Cell 架构设计介绍,及Java实现方案的探索

横向扩展(Scalability):通过动态增减CellApp和BaseApp的数量,可以轻松应对玩家人数的变化。世界可以做得非常大,只需增加更多的 Cell。负载分离(Load Separation):将不同性质的负载分离,避免了单一进程瓶颈。CPU 密集型的实时计算(CellApp)和 I/O 密集型的数据操作(BaseApp)互不影响。高效的视野管理(AOI):每个 Cell 只关心自己区域内和边界上的实体,大大降低了计算复杂度。容错性:某个CellApp。

代码时光 1205

XHR+Promise五分钟学会封装一个属于自己的axios

XHR+Promise五分钟学会封装一个属于自己的axios

jk0025的博客 1161

卡方检验的隐藏逻辑:为什么正态分布的平方和如此重要?

本文深入探讨了卡方检验的核心逻辑,揭示了正态分布平方和在统计检验中的重要性。通过分析卡方分布与伽马分布的关系,以及实际应用案例,帮助读者理解卡方检验的原理、局限及高级应用场景,为数据分析提供有力工具。

3a9bq4r8t2y的博客 208

【汽车故障诊断2】从标准到实战:解码DTC格式背后的诊断逻辑

本文深入解析汽车诊断故障码(DTC)的格式与逻辑,对比了OBD-II标准(如ISO 15031-6)的5字符格式与UDS协议(ISO 14229-1)下更丰富的3字节格式。文章从国际标准出发,结合实战案例,阐述了DTC如何作为汽车电子系统的“体检报告”,帮助工程师和维修技师精准定位故障,并详细解读了UDS 19服务如何读取和管理DTC状态。

berry的博客 711

封装XHR

// 1.把参数进行处理 // 1.1 拼接为特定格式字符串! // 1.2 需要对字符串处理 encodeURI(); let str="name=张三&age=18"; str = encodeURI(str); console.log(str); // 没有%?只能中文!传输数据编码格式 urlencoded 只支持ASCII; // 2.xhr实例化 let xhr = new XMLHttpRequest(); // 3.设置方式,url // 3.1 get x.

weixin_57653722的博客 590

论文解读——YOLOv11(目标检测)

YOLOv11提供了多种型号和功能,以满足不同应用场景的需求。对象检测对象检测是YOLOv11的基本功能之一。在训练时,YOLOv11能够检测图像中的对象,并输出对象的边界框和类别信息。这一功能在自动驾驶、智能安防等领域具有广泛应用。图像分割图像分割是YOLOv11的另一个重要功能。与对象检测不同,图像分割不仅检测对象的边界框,还能够对图像中的对象进行像素级别的分割。这使得YOLOv11在医疗影像分析、工业制造等领域具有更高的应用价值。姿态检测姿态检测是YOLOv11的一个独特功能。

qq_38220914的博客 4457

AJAX第三天XHR

XMLHttpRequest(XHR)对象用于与服务器交互。通过XMLHttpRequest可以在不刷新网页的情况下请求特定URL、获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest在AJAX编程中被大量使用。axios 内部采用 XMLHttpRequest 与服务器交互,axios 是对 XHR 相关代码进行了封装,让我们只关心传递的接口参数创建 XHR 对象调用 open 方法,设置 url 和请求方法监听 loadend 事件,接收结果。

2301_81525305的博客 393

在 SAP BTP 上为应用开启多租户能力:基于 SaaS Provisioning 和 XSUAA 的完整实践指南

本文介绍了在SAP BTP上配置多租户应用的实战指南。主要内容包括: 多租户架构概述:解释provider子账户、consumer子账户和tenant的概念,以及数据隔离机制。 安全配置:在xs-security.json中设置tenant-mode为shared,并为SaaS Provisioning服务添加回调scope授权。 路由配置:通过manifest.yml设置TENANT_HOST_PATTERN来定义多租户访问模式,确保不同租户通过不同子域名访问同一应用。 服务绑定:将XSUAA和SaaS

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 145

【TC3xx芯片】TC3xx芯片UCB详解

TC3xx芯片UCB详解

qq_36056498的博客 1万+

还在 XHR、Fetch 和 Axios 之间纠结?我踩过的坑,希望你一个都不用碰到

XHR 对请求状态的判断特别啰嗦,onload 只处理成功,网络错误你得监听 onerror,超时还得单独设 timeout,漏掉一个线上就能崩给你看。根据以往的血泪经验,正确的做法还是要先检查 res.ok,不 ok 立刻手动抛出一个错误,不然等线上用户截图过来,你 debug 都找不到北。你可能会问,“这也没有回调地狱呀”,那试想一下,你在第一个请求200后,需要再用返回数据进一步请求呢?但很不爽的是,它那个“只拒网络错,不拒 HTTP 错”的臭脾气,让我实实在在地翻过几次车,怎么改都拿不到数据。

QwYdqik99的博客 178

华为OD机试真题2025双机位A卷 C++ 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 674

前端请求方式

直译是异步JS和XML(XML类似HTML,但是设计宗旨就为了传输数据,现已被JSON代替),解释一下就是说以XML作为数据传输格式发送JS异步请求。,拿来跟ajax对比是完全不合理的,它们完全不是一个概念的东西,适合拿来和fetch对比的其实是xhr,也就是上面封装ajax请求的代码里的XMLHttpRequest,这两都是JS自带的发请求的方法,而。axios利用xhr进行了二次封装的请求库,xhr只是axios中的其中一个请求适配器,axios在nodejs端还有个http的请求适配器;

m0_62201781的博客 688

EtherCAT主站SOEM -- 0 -- 该EtherCAT主站SOEM专栏后续安排

SOEM(Simple Open EtherCAT Master)是一个开源的EtherCAT主站库,允许开发者构建自定义的EtherCAT主站应用程序。EtherCAT是一种实时以太网通信协议,广泛应用于工业自动化和机器控制领域。开源性质:SOEM是一个开源项目,这意味着开发者可以自由地查看、修改和分发代码。这使其成为工业自动化领域的一个强大工具,可以根据具体需求进行定制。EtherCAT主站实现:SOEM库提供了一个完整的EtherCAT主站实现,允许主站与多个EtherCAT从站设备进行通信。

常驻客栈的博客--嵌入式EtherCAT 6666

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用XHR和Promise简易实现Axios

本文介绍了三种JavaScript网络请求技术:1. XMLHttpRequest(XHR):浏览器原生API,支持异步HTTP请求,是AJAX技术的核心,可处理多种数据格式并提供事件监听机制。2. Promise:用于处理异步操作的对象,解决回调地狱问题,具有Pending、Fulfilled、Rejected三种状态。3. Axios:基于Promise的HTTP客户端,支持请求拦截、自动数据转换和取消请求等功能。文章通过代码示例演示了如何使用这些技术实现无参请求、带查询参数请求和POST请求,并比较了

Ewareness的博客 1670

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

AJAX 03 XMLHttpRequest、Promise、封装简易版 axios

AJAX 3 原理 XMLHttpRequest; Promise;封装简易版 axios

yavlgloss的博客 1476

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

AJAX 原理---XMLHttpRequest,Promise,封装简易版 axios,案例 - 天气预报

本文介绍了XMLHttpRequest(XHR)的基础使用和Promise封装方法。主要内容包括:1)XHR的基本使用步骤,包括创建对象、配置请求、监听事件和发送请求;2)使用XHR处理查询参数和数据提交;3)Promise的基本概念和三种状态;4)将XHR封装成Promise形式的myAxios函数,支持GET/POST请求和参数处理;5)天气预报案例,演示如何通过封装好的myAxios函数获取并展示天气数据。文章通过具体代码示例,展示了如何利用XHR和Promise实现前后端数据交互,并最终封装成类似a

m0_60430540的博客 1550

什么是axios?怎么使用axios封装Ajax?

Axios 是一个基于 Promise 的 HTTP 客户端,它可以在浏览器和 Node.js 环境中使用。Axios 提供了简单易用的 API,用于执行各种 HTTP 请求操作,如 GET、POST、PUT、DELETE 等。基于 Promise:Axios 的 API 设计完全基于 Promise,这使得它能够很好地与 async/await 语法结合使用,从而简化了异步操作的处理。请求和响应的拦截器:Axios 支持请求和响应的拦截器,允许你在请求发送前或响应接收后对其进行处理。

上官花雨滴博客!!! 2169

promise对axios二次封装、promise封装ajax、promise封装wx.request、promise封装uni.reqest

在学习了promisse的基本知识后,下一步就是promise如何使用呢? 根据老湿从业8年的经验。将promise在项目中的使用总结如下几项: 1. 使用promise对axios进行二次封装 axios本身就是使用promise封装的http库,为什么还要对它进行二次封装呢?在一个项目中我们肯定要使用很多接口,每个接口主要是.get()或者.post()请求,所以我们就要自己手动封装一个全局的Axios网络模块,这样的话就既方便也会使代码量不那么冗余。 步骤1.给axios设置请求拦截,响应拦截。 //

田兴的博客 4187

Ajax原理-XMLHttpRequest、Promise以及封装简易的axios函数

浏览器提供给服务器的额外信息,让服务器返回浏览器想要的数据Promise对象用于表示一个异步操作的最终完成(或失败)及其结果值。

2302_80141844的博客 903

一文读懂AJAX Axios Promise

And)是一种在 Web 应用中通过异步发送 HTTP 请求向服务器获取内容,并使用这些新内容更新页面中相关的部分,而无需重新加载整个页面的 Web 开发技术。这可以让网页更具有响应性,因为只请求了需要更新的部分。

qq_64057263的博客 1690

如何自己封装 简易axios

/ 1. 定义myAxios函数,接收配置对象,返回Promise对象。// 4. 使用myAxios函数,获取省份列表展示。// 2. 发起XHR请求,默认请求方法为GET。// 1. 判断有params选项,携带查询参数。// 3. 使用myAxios函数,获取地区列表。// 3. 使用myAxios函数,完成注册用户。// 1. 判断有data选项,携带请求体。// 如果没有请求体数据,正常的发起请求。// 3. 调用成功/失败的处理程序。// 调用成功/失败的处理程序。

Adios_0403的博客 192

AJAX 入门 day3 XMLHttpRequest、Promise对象、自己封装简单版的axios

学习之前先了解一下ajax和axios之间的区别:是一种允许网页在后台与服务器进行数据交换的技术,而不需要重新加载整个页面。它不是一种特定的库或框架,而是一种实现异步数据传输的通用方法。,它适用于浏览器和 node.js。(在浏览器中)或 node.js 的原生 HTTP 模块,但它抽象了它们的复杂性,使得发送请求更加容易。在现代前端开发中,Axios 被广泛推荐用来发起 HTTP 请求,因为它简单易用,并且容易集成到常见的进程式任务中,如 React、Vue 或 Angular 应用。

2301_77358195的博客 1523

封装简易版 Axios

基于 Promise + XHR 封装 myAxios 函数。

m0_57184906的博客 758

axios和ajax的区别

1、axios是通过promise实现对ajax技术的一种封装,就像jQuery实现ajax封装一样。 简单来说: ajax技术实现了网页的局部数据刷新,axios实现了对ajax的封装。 axios是ajax ajax不止axios。 2、优缺点 ajax: 本身是针对MVC的编程,不符合现在前端MVVM的浪潮 基于原生的XHR开发,XHR本身的架构不清晰,已经有了fetch的替代方案 JQue...

weixin_44751462的博客 7022
上一篇: ES6: Proxy概念及用法
下一篇: AJAX: 事件循环(举例细论)
CaptainDrake
博客等级 码龄6年 5363粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值