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

【ajax07基础】回调函数地狱

一:什么是回调函数地狱

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

回调函数地狱存在问题:

  • 可读性差
  • 异常捕获严重
  • 耦合性严重
  // 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/387137.html

相关文章:

  • 华为升腾显卡选型备忘
  • Interview preparation--elasticSearch正排索引原理
  • C++精解【10】
  • Linux高级编程——进程
  • 手机数据恢复篇:如何在OPPO中恢复永久删除的视频?
  • Obsidan插件开发
  • 【全球首个开源AI数字人】DUIX数字人-打造你的AI伴侣!
  • 微信小程序服务器从腾讯云迁移到阿里云出现的坑
  • SQL Server触发器深度解析:数据完整性的守护者
  • Qt信号槽的坑
  • 昇思MindSpore学习笔记1--基本介绍
  • Github Page 使用手册(保姆级教程!)
  • zram压缩机制看swapon系统调用
  • SpringBoot2+Vue3开发博客管理系统
  • JS【详解】Symbol (含Symbol 作为属性名,静态方法for 和 keyFor,11 个内置的 Symbol 值)
  • Vue 项目运行时,报错Error: Cannot find module ‘node:path‘
  • 综合评价 | 基于组合博弈赋权的物流系统综合评价(Matlab)
  • 国标GB28181视频汇聚平台EasyCVR安防监控系统常见播放问题分析及解决方法
  • 30 哈希的应用
  • (笔记)Error: qemu-virgl: Failed to download resource “qemu-virgl--test-image“解决方法
  • IntelliJ IDEA介绍
  • 【office技巧】如何合并pdf并且添加目录页
  • Spring Boot中的安全性配置详解
  • 数据权限和字段权限设计指南
  • Linux 常用命令之 RZ和SZ 简介
  • Docker Compose:简化多容器管理的利器
  • 深度解析:机器学习如何助力GPT-5实现语言理解的飞跃
  • Springcloud-消息总线-Bus
  • js 接收回调函数 转换为promise
  • Python 面试【★★★】