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

概念

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

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

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

问:

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 对象成功状态的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值