当前位置: 首页 > news >正文

【ajax基础】回调函数地狱

一:什么是回调函数地狱

在一个回调函数中嵌套另一个回调函数(甚至一直嵌套下去),形成回调函数地狱

回调函数地狱存在问题:

  • 可读性差
  • 异常捕获严重
  • 耦合性严重
  // 1. 获取默认第一个省份的名字axios({url: 'http://hmajax.itheima.net/api/province'}).then(result => {const pname = result.data.list[0]document.querySelector('.province').innerHTML = pname// 2. 获取默认第一个城市的名字axios({url: 'http://hmajax.itheima.net/api/city', params: { pname }}).then(result => {const cname = result.data.list[0]document.querySelector('.city').innerHTML = cname// 3. 获取默认第一个地区的名字axios({url: 'http://hmajax.itheima.net/api/area', params: { pname, cname }}).then(result => {console.log(result)const areaName = result.data.list[0]document.querySelector('.area').innerHTML = areaName})})}).catch(error => {console.dir(error)})

每一axios函数then方法的回调函数中嵌套着其他回调函数,导致可读性非常差。如果内部axios函数有错误,通过catch也难以捕获错误信息。

二:Promise——链式调用

什么是链式调用

  1. Promise对象.then(result=>{return new Promise()})方法会返回一个新生成的Promise对象
  2. 在其then方法的回调函数中return返回值,会影响Promise对象.then所生成的Promise对象最终状态和结果
  3. 利用Promise.then生成的新的Promise对象的then方法,接收return返回值
  4. 依据不停的Promise链式调用,最终实现任务达成

一句话,使用then方法返回新的Promise对象特性,一直串联下去解决任务

   //  1 创建Promise对象,模拟请求省份名字const p = new Promise((resolve, reject) => {setTimeout(() => {resolve('北京市')}, (2000));})// 2 获取城市名字const p2 = p.then(result => {console.log(result);//北京市// 3 创建Promise对象,模拟请求城市名字// return Promise对象最终结果和状态,影响到新的Promise对象(p.then生成的Promise对象)return new Promise((resolve, reject) => {setTimeout(() => {resolve(result + '---北京')}, 2000)})})p2.then(result => {console.log(result);//北京市---北京})console.log(p2);//Promise对象

下面就是利用链式调用,实现查找省份、城市下,市区名字查找

<form><span>省份:</span><select><option class="province"></option></select><span>城市:</span><select><option class="city"></option></select><span>地区:</span><select><option class="area"></option></select></form><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script>/*** 目标:把回调函数嵌套代码,改成Promise链式调用结构* 需求:获取默认第一个省,第一个市,第一个地区并展示在下拉菜单中*/let pname = ''// 1. 得到-获取省份Promise对象axios({url: 'http://hmajax.itheima.net/api/province'}).then(result => {pname = result.data.list[0]document.querySelector('.province').innerHTML = pname// 2. 得到-获取城市Promise对象return axios({url: 'http://hmajax.itheima.net/api/city', params: { pname }})}).then(result => {const cname = result.data.list[0]document.querySelector('.city').innerHTML = cname// 3. 得到-获取地区Promise对象return axios({url: 'http://hmajax.itheima.net/api/area', params: { pname, cname }})}).then(result => {console.log(result)const areaName = result.data.list[0]document.querySelector('.area').innerHTML = areaName})</script>

作用

Promise链式调用解决了回调函数地狱问题

http://www.lryc.cn/news/380224.html

相关文章:

  • SparkSQL的分布式执行引擎-Thrift服务:学习总结(第七天)
  • 联华集团:IT团队如何实现从成本中心提升至价值中心|OceanBase 《DB大咖说》(十)
  • 计算机系统基础实训五—CacheLab实验
  • PHP框架之CodeIgniter框架
  • 714. 买卖股票的最佳时机含手续费
  • Linux系统查看程序内存及CPU占用
  • 数据结构7---图
  • Excel 如何复制单元格而不换行
  • 前端 CSS 经典:mix-blend-mode 属性
  • OpenCV--滤波器(一)
  • MK的前端精华笔记
  • 低代码平台框架:开源选型、实践与应用深度解析
  • 深度学习500问——Chapter12:网络搭建及训练(3)
  • Android使用DevRing框架搭建数据库实体类以及使用
  • 高效BUG管理:定级、分类和处理流程
  • 服务器数据恢复—raid5热备盘同步失败导致阵列崩溃如何恢复数据?
  • Ubuntu iso 镜像下载 步骤截图说明
  • git拉取gitee项目到本地
  • 力扣42.接雨水
  • 国产数据库与MYSQL兼容性?开发应该怎么选择?
  • Spring框架中Bean的生命周期
  • 从零到一学FFmpeg:avformat_alloc_output_context2 函数详析与实战
  • Lua 绕过元表
  • pip方法总结(极简快速掌握)
  • aigc基础概念(一)
  • USB学习——12、usb初始化和插拔驱动软件流程大致框架描述
  • 【ARMv8/ARMv9 硬件加速系列 2.4 -- ARM NEON Q寄存器与V寄存器的关系】
  • Oracle中递归查询(START WITH……CONNECT BY……)
  • 【云原生|K8S系列】如何创建Kubernetes job和Cronjobs 入门指南
  • 力扣每日一题 6/23 字符串/模拟