首页 > 其他分享 >函数回调地狱 + 解决方法(详解)

函数回调地狱 + 解决方法(详解)

时间:2024-08-18 19:26:59浏览次数:7  
标签:地狱 const 函数 await 详解 Promise pname 回调

概念

需求:展示默认第一个省,第一个城市,第一个地区在下拉菜单中

概念:在回调函数中嵌套回调函数,一直嵌套下去就形成了回调函数地狱 

缺点:可读性差,异常无法捕获,耦合性严重,牵一发动全身

问:

1.什么是回调地狱?

答案:在回调函数一直向下嵌套回调函数,形成回调函数地狱

2.回调函数地狱问题?

可读性差,异常捕获困难,耦合性严重

解决方法

怎么解决回调地狱问题?

方法一:  promise - 链式调用

方法二:  async函数和await

标题promise - 链式调用

法一(拿开头问题示例):

概念:依靠 then() 方法会返回一个新生成的 Promise 对象特性,继续串联下一环任务,直到结束

 细节:then() 回调函数中的返回值,会影响新生成的 Promise 对象最终状态和结果

 

/**
    * 目标:把回调函数嵌套代码,改成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
   })

:

1.Promise 链式调用如何解决回调函数地狱?

答案:then 的回调函数中 return Promise对象,影响当前新 Promise 对象的值

法2示例:

 概念:在 async 函数内,使用 await 关键字取代 then 函数,等待获取 Promise 对象成功状态的结果值

 做法:使用 async 和 await 解决回调地狱问题


   /**
    * 目标:掌握async和await语法,解决回调函数地狱
    * 概念:在async函数内,使用await关键字,获取Promise对象"成功状态"结果值
    * 注意:await必须用在async修饰的函数内(await会阻止"异步函数内"代码继续执行,原地等待结果)
   */
   // 1. 定义async修饰函数
   async function getData() {
     // 2. await等待Promise对象成功的结果
     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 areaName = aObj.data.list[0]
   
   
     document.querySelector('.province').innerHTML = pname
     document.querySelector('.city').innerHTML = cname
     document.querySelector('.area').innerHTML = areaName
   }
   
   getData()

:

1.await 的作用是什么?

答案:替代 then 方法来提取 Promise 对象成功状态的结果

标签:地狱,const,函数,await,详解,Promise,pname,回调
From: https://blog.csdn.net/m0_73890048/article/details/141303817

相关文章

  • 专题:C语言操作符详解
    ⽬录1.操作符的分类2.⼆进制和进制转换3.原码、反码、补码4.移位操作符5.位操作符:&、|、^、~6.单⽬操作符7.逗号表达式8.下标访问[]、函数调⽤()9.结构成员访问操作符10.操作符的属性:优先级、结合性11.表达式求值1.操作符的分类•算术操作符:+、-......
  • FreeRTOS 任务相关API函数
    FreeRTOS任务相关API函数函数描述uxTaskPriorityGet()获取任务优先级vTaskPrioritySet()设置任务优先级uxTaskGetNumberOfTasks()获取系统中任务的数量uxTaskGetSystemState()获取所有任务状态信息vTaskGetInfo()获取指定单个的任务信息xTaskG......
  • 嵌入式中PID算法分析与实现详解
        看起来PID高大尚,先被别人唬住,后被公式唬住,由于大多数人高数一点都不会或者遗忘,所以再一看公式,简直吓死。    直接从网上找了PID相关公式截图如下。    了解了很浅的原理后,结果公式看不懂,不懂含义,所以最终没有透彻。我这里先对公式进行剖析,公式理解明白......
  • 一文详解帮助中心FAQ系统:定义、作用、实际应用
    在信息爆炸的时代,优质客户服务已成为企业竞争的关键要素之一。而帮助中心FAQ系统,作为客户服务体系中的重要组成部分,其重要性日益凸显。本文旨在通过清晰的结构和通俗易懂的语言,深入探讨帮助中心FAQ系统的定义及其在企业运营中的多重作用。一、定义篇:什么是帮助中心FAQ系......
  • [Lang] 函数模板
    [Lang]函数模板1.自动类型推导和显示指定类型自动类型推导不能进行隐式类型转换。显式指定类型可以进行隐式类型转换。但前提是函数模板的参数必须按值传递,因为按引用传递不支持隐式类型转换。#include<iostream>usingnamespacestd;template<typenameT>TmyAdd(T......
  • Unity 常用的生命周期函数
    publicclassMonoLife:MonoBehaviour{  privatevoidAwake()  {    print("Awake:只要物体显示状态为true则调用一次");  }  privatevoidOnEnable()  {    print("OnEnable:每一次物体启用时调用");  }  private......
  • 开窗函数的另外一种方式
       https://leetcode.cn/problems/game-play-analysis-iii/solutions/286941/chao-xiang-xi-tu-jie-zi-lian-jie-by-piajun===如下第一种最简单的开窗selectplayer_id,event_date,sum(games_played)over(partitionbyplayer_idorderbyevent_date......
  • C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现
    文章目录strlen的使用和模拟实现函数的原型strlen模拟实现:方法1方法2方法3strcpy的使用和模拟实现函数的原型strcpy的模拟实现:strcat的使用和模拟实现函数的原型strcat的模拟实现:strcmp的使用和模拟实现函数的原型strcmp的模拟实现本章的内容主要讲解这4个与字符......
  • Codesy是使用加法函数实现加法运算示例
    Codesys的函数比较常用,需要熟练掌握,下面介绍如何通过函数实现加法运算:首先添加对象,添加POU函数名改为Add1,类型函数,返回类型int;Add1里面的定义如下:FUNCTIONAdd1:INTVAR_INPUT   In1:INT;   In2:INT:=1;END_VARVAREND_VAR程序如下:Add1:=In1+In2;然后看......
  • MybatisPlus分页查询详解
    MybatisPlus分页查询详解一直对于分页查询的插件用的不是很熟练,这次在学习mp的时候又一次学到了分页查询,在这个过程中发现学到的东西挺多的,想着可以分享给大家,往下看前请保证对泛型以及函数式接口编程有一定了解1MybatisPlus的基础介绍这边主要是讲解他的一个分......