【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链式调用解决了回调函数地狱问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/735148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一次接触Swing

学习java版的HslCommunication发现使用的是Swing&#xff0c;所以了解了一下~ 了解&#xff1a; Swing是Java的标准库&#xff08;Java Foundation Classes, JFC&#xff09;的一部分&#xff0c;用于构建桌面应用程序的图形用户界面&#xff08;GUI&#xff09;。它是Java AWT…

Java程序之百鸡百钱问题

题目&#xff1a; 百钱买百鸡的问题算是一套非常经典的不定方程的问题&#xff0c;题目很简单&#xff1a;公鸡5文钱一只&#xff0c;母鸡3文钱一只&#xff0c;小鸡3只一文钱&#xff0c;用100文钱买一百只鸡,其中公鸡&#xff0c;母鸡&#xff0c;小鸡都必须要有&#xff0c;…

JWT介绍及其基本使用

JWT介绍及其基本使用 官网&#xff1a;https://jwt.io/ 什么是JWT 全称&#xff1a;JSON Web Token&#xff08;JSON Web令牌&#xff09; 一个开放标准(RFC 7519) &#xff0c;它定义了一种紧凑和自包含的方式&#xff0c; 用于作为 JSON 对象在各方之间安全地传输信息。此信…

Day 30:100344. 使二进制数组全部等于1的最小操作次数Ⅰ

Leetcode 100344. 使二进制数组全部等于1的最小操作次数Ⅰ 给你一个二进制数组 nums 。 你可以对数组执行以下操作 任意 次&#xff08;也可以 0 次&#xff09;&#xff1a; 选择数组中 任意连续 3 个元素&#xff0c;并将它们 全部反转 。 反转 一个元素指的是将它的值从 0 变…

云资源管理系统-项目部署

云资源管理系统-项目部署 大家好&#xff0c;我是秋意零。 今天分享个人项目同时也是个人毕设项目&#xff0c;云平台资源管理系统。该系统具备对OpenStack最基本资源的生命周期管理&#xff0c;如&#xff1a;云主机、云盘、镜像、网络。 该篇主要介绍&#xff0c;项目在Li…

idea2022激活

下载激活脚本 解压后&#xff0c;打开文件夹如下&#xff1a;ja-netfilter.jar 为激活补丁&#xff1a; 复制补丁所在的整个文件夹到硬盘某个位置 将 ja-netfilter补丁所在的整个文件夹移动到电脑上某个位置&#xff0c;我是放到了 D 盘下&#xff1a; &#xff08;路径中不…

【职场人】职场故事:与邀功精的共舞

在我的职业生涯中&#xff0c;我遇到过一位特别引人注目的同事&#xff0c;我们都叫他李经理。他的工作能力并不差&#xff0c;但他有一个习惯&#xff0c;那就是喜欢邀功。他的这种习惯&#xff0c;不仅让我印象深刻&#xff0c;也让我在合作中学会了不少东西。 恶心的四件事 …

包含网关的概念及案例演示

包容网关 知识点讲解 包容网关可以看作排他网关和并行网关的结合体。与排他网一样&#xff0c;可以在外出顺序流上定义条件&#xff0c;但与排他网关不同的是&#xff0c; 进行决策判读时&#xff0c;包容网关所有条件为true的后继分支都会被依次执行。如果所有分支条件都为fa…

【mysql】建库

通过命令建库&#xff1a; CREATE DATABASE database_name; 如果是用Workbench&#xff1a;

QuantML-Qlib Model | Kansformer: KAN+Transformer时序模型用于股票收益率预测

QuantML-Qlib Model | Kansformer&#xff1a; KANTransformer时序模型用于股票收益率预测 原创 QuantML QuantML 2024-06-18 20:57 上海 Content 之前公众号介绍了几篇KAN的文章&#xff0c;也做过KAN相关的模型&#xff1a; What KAN I say&#xff1f;KAN代码全解析 Qu…

android——Spinner下拉列表案例详解

使用案例 效果图&#xff1a; ![](https://img-blog.csdnimg.cn/20190327125727253.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0​ L3FxXzQwMjA1MTE2,size_16,color_FFFFFF,t_70) 代码实现&#xff1a; 下拉列…

Python中常见图形绘制

1、背景介绍 在点云三维重建中&#xff0c;常涉及到常见几何图形绘制&#xff0c;如直线、多边形、圆形、正方形、长方形等。因此&#xff0c;本次博客结合matplotlib库&#xff0c;介绍常见几何图形的绘制。 2、几何图形绘制 2.1 线段绘制 线段是一种常见的几何图形&#xff…

Pip换源秘籍:让你的Python包飞行起来!

在Python的包管理中&#xff0c;Pip是最重要的工具之一。它允许开发者从Python Package Index (PyPI)安装包&#xff0c;但有时由于网络问题或服务器负载过高&#xff0c;直接从PyPI安装包可能会非常慢。这时&#xff0c;更换Pip源到一个更快的镜像站点是一个常见的解决方案。本…

人工智能在数字病理切片虚拟染色以及染色标准化领域的研究进展|顶刊速递·24-06-23

小罗碎碎念 本期推文主题&#xff1a;人工智能在数字病理切片虚拟染色以及染色标准化领域的研究进展 这一期的推文是我发自内心觉得为数不多&#xff0c;特别宝贵的一篇推文&#xff0c;原因很简单——可参考的文献相对较少&方向非常具有研究意义&现在不卷。 数字病理…

洛谷P8502题解

[problem] \color{blue}{\texttt{[problem]}} [problem] [Solution] \color{blue}{\texttt{[Solution]}} [Solution] 这题最恶心的地方是卡空间。 我们先考虑不卡空间时怎么做。 直接并不好做&#xff0c;我们考虑正难则反&#xff0c;即利用容斥原理。答案应为从 a a a 没…

PostgreSQL如何定义缓冲区管理器?

目录 一、PostgreSQL是什么二、缓冲区管理器介绍三、缓冲区管理器的应用场景四、如何定义缓冲区管理器 一、PostgreSQL是什么 PostgreSQL是一种高级的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它以其稳定性、可靠性和高度可扩展性而闻名。它最初由加…

职升网:注安工程师适合用什么样的答题方法?

一、熟悉题型与答题方法&#xff1a; 不同科目和题型有不同的答题技巧。例如&#xff0c;选择题可采用排除法、关键词推理法及对比分析法等方式答题&#xff1b;案例分析题则需要全面考虑&#xff0c;逐条举例。 二、合理规划时间&#xff1a; 在考试时&#xff0c;要合理规…

ICP、ISP及IAP烧录介绍

文章目录 不同的程序下载方式一、ICP:In-Circuit Programming二、ISP:In-System Programming三、IAP:In-Application ProgrammingIAP方案设计不同的程序下载方式 目前,单片机的程序烧录方式可以分为三种:ICP、ISP、IAP。 ICP:In Circuit Programing,在电路编程; ISP:…

【辨析】快速了解RBF神经网络与BP神经网络的区别

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、RBF与BP模型简介1.1.模型结构1.2.模型表达式 二、RBF神经网络与BP神经网络的对比2.1 RBF与BP的激活函数对比2.2 RBF与BP的思想对比 三、RBF神经网络与BP神经网络的训练方法对比2.1.BP神经网络的训练2.2.RBF神…

ultralytics官方更新 | 添加YOLOv10到ultralytics

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、…