async和await解决回调函数地狱

news/2025/2/27 13:19:07/

目录

目的:

文件名称:

代码解释:

代码:

使用方法:

结论:


以下是代码的详细介绍,以及如何使用它。

目的:

这个示例展示了如何使用 asyncawait 语法来解决传统回调函数(callback hell)的问题。通过使用 asyncawait,我们可以让异步代码更加简洁易读。代码通过请求API获取省份、城市和地区的列表,并将这些数据填充到HTML的下拉选择框中。

文件名称:

index.html

代码解释:

  1. HTML 部分

    • <body> 中,有一个简单的表单,包含三个 select 元素分别用于显示省份、城市和地区。
    • <span> 标签是为了给每个 select 元素提供标签(例如 "省份"、"城市")。
  2. 外部 JavaScript 引用

    • 通过 script 标签引入了 axios 库,这个库用于发送 HTTP 请求并处理响应。
  3. JavaScript 部分

    • <script> 标签内,定义了一个异步函数 getArea(),这个函数的作用是依次获取省份、城市和地区的数据,并将其填充到相应的下拉框中。
    • async function getArea()
      • 该函数是异步的,意味着它会返回一个 Promise 对象,并且可以使用 await 来等待异步操作完成。
    • await
      • 使用 await 关键字来等待 axios 请求的结果。每次请求返回的数据会被赋值给相应的变量 pname(省份)、cname(城市)、area(地区)。
      • 每一次 await 后面的代码都会在前一次请求完成后才执行,从而避免了回调地狱问题。
    • axios 请求:
      • 第一个请求从 http://hmajax.itheima.net/api/province 获取省份数据。
      • 第二个请求根据省份名称 pname 获取城市数据。
      • 第三个请求根据省份和城市名称获取地区数据。
    • 最后,将获取到的省份、城市和地区名称填充到对应的 select 元素中。
  4. 程序运行结果

    • 当页面加载时,getArea() 函数会被调用,依次获取省份、城市和地区的数据。
    • 如果成功响应,页面中的三个下拉框将显示省份、城市和地区的名称。
    • 如果任何请求失败,页面将不会更新下拉框的内容。

代码(index.html):

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>async函数和await_解决回调函数地狱</title>
</head><body><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>/*** 目标:掌握async和await语法,解决回调函数地狱* 概念:在async函数内,使用await关键字,获取Promise对象"成功状态"结果值* 注意:await必须用在async修饰的函数内(await会阻止"异步函数内"代码继续执行,原地等待结果)*/async function getArea(){const pObj = await axios({url:'http://hmajax.itheima.net/api/province'})const pname = pObj.data.list[0]  // 输出为 省名字const cObj = await axios({url:'http://hmajax.itheima.net/api/city',params:{pname}})const cname = cObj.data.list[0]  // 输出为 市名字const aObj = await axios({url:'http://hmajax.itheima.net/api/area',params:{pname,cname}})const area = aObj.data.list[0]  // 输出为 区名字document.querySelector('.province').innerHTML = pnamedocument.querySelector('.city').innerHTML = cnamedocument.querySelector('.area').innerHTML = area}getArea()</script>
</body></html>

使用方法:

  1. 将以上代码保存为 index.html 文件。
  2. 在浏览器中打开此文件,页面将自动显示三个下拉框。
  3. 下拉框的内容将会根据异步请求填充相应的省份、城市和地区名称。

结论:

这个示例展示了如何使用 asyncawait 来简化异步代码,避免了回调函数的嵌套,使代码更加易于理解和维护。同时,通过 axios 库来处理 API 请求。

 


http://www.ppmy.cn/news/1575254.html

相关文章

单片机 Bootloade与二进制文件的生成

单片机的 Bootloader 是一种特殊的程序&#xff0c;负责在单片机上电后初始化硬件、更新用户应用程序&#xff08;固件&#xff09;&#xff0c;并将控制权移交给用户程序。以下是其运行机制和关键流程的详细说明&#xff1a; 1、单片机 Bootloader 的核心作用 固件更新&…

【Linux】调试工具GDB的使用及案例讲解

Linux系列 文章目录 Linux系列前言一、gdb的使用背景二、gdb的使用总结 本篇主要针对小白讲解&#xff0c;可以很多地方比较咯嗦 前言 GDB是Linux下一款强大的调试工具。GDB可以调试C、C、Java等语言&#xff0c;对于在Linux下工作的程序员来说&#xff0c;GDB是必不可少的调试…

一文2500字从0到1实现压测自动化!

大家好&#xff0c;我是小码哥&#xff0c;最近工作有点忙&#xff0c;一直在实现压测自动化的功能&#xff0c;今天来分享一下实现思路 我所在的业务线现在项目比较少了&#xff0c;所以最近一个月我都没有做业务测试&#xff0c;需求开发完后RD直接走免测就上线&#xff0c;…

蓝桥杯18582-真人鉴定器

蓝桥杯18582-真人鉴定器 介绍 真人鉴定功能是一种常见的网络安全措施&#xff0c;用于保护网站免受机器人或自动化程序的恶意攻击。该功能基于人类视觉能力&#xff0c;要求用户在访问网站时通过切换右边轮播图&#xff0c;识别与左边要求的图片个数相符的图片&#xff0c;并…

STM32-智能台灯项目

一、项目需求 1. 红外传感器检测是否有人&#xff0c;有人的话实时检测距离&#xff0c;过近则报警&#xff1b;同时计时&#xff0c;超过固定时间则报警&#xff1b; 2. 按键 1 切换工作模式&#xff1a;智能模式、按键模式、远程模式&#xff1b; 3. 智能模式下&#xff0c;根…

TLS与自签名证书的创建、作用、用到的工具等知识的介绍

一、OpenSSL 与KeyTool 1.1、OpenSSL 1.1、是什么 OpenSSL 是一个跨平台密码学工具套件&#xff0c;它实现了安全套接层&#xff08;SSL&#xff09;和传输层安全&#xff08;TLS&#xff09;的协议栈&#xff0c;还提供了各种加密算法&#xff08;如对称加密&#xff08;如 A…

力扣 807. 保持城市天际线(Java实现)

题目分析 给定一个二维数组&#xff0c;行列长度相等&#xff0c;要保持四个方向仍一观察高度不变的情况下&#xff0c;适当添加建筑高度&#xff0c;问最大高度增量和。所谓四个方向高度不变的增量&#xff0c;其实就是arr[i][j]与同i行最大值同j列最大值之间的最小值的差&…

物联网综合实训室建设方案的探讨(职业院校物联网综合实训室建设方案)

随着物联网技术的迅猛发展&#xff0c;社会对物联网人才的需求日益增加。为了满足这一需求&#xff0c;高校和职业院校纷纷开始建设物联网综合实训室&#xff0c;以培养具备实际操作能力和创新思维的高素质物联网人才。本文旨在探讨一种行之有效的物联网综合实训室建设方案&…