• AJAX——Promise-链式调用


    1.Promise链式调用

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

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

    好处:通过链式调用,解决回调函数嵌套问题

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Promise_链式调用</title>
    8. </head>
    9. <body>
    10. <script>
    11. /**
    12. * 目标:掌握Promise的链式调用
    13. * 需求:把省市的嵌套结构,改成链式调用的线性结构
    14. */
    15. // 1. 创建Promise对象-模拟请求省份名字
    16. const p = new Promise((resolve,reject) => {
    17. setTimeout(() => {
    18. resolve('北京市')
    19. },2000)
    20. })
    21. // 2. 获取省份名字
    22. const p2 = p.then(result => {
    23. console.log(result)
    24. // 3.创建Promise对象-模拟请求城市名字
    25. // return Promise对象最终状态和结果,会影响到新的Promise对象
    26. return new Promise((reselve,reject) => {
    27. setTimeout(() => {
    28. resolve(result + '--- 北京')
    29. },2000)
    30. })
    31. })
    32. // 4.获取城市名字
    33. p2.then(result => {
    34. console.log(result)
    35. })
    36. // then()函数的结果是一个新的Promise对象
    37. console.log(p2 === p)
    38. </script>
    39. </body>
    40. </html>

     2.Promise链式应用-解决回调函数地狱

    目标:使用Promise链式调用,解决回调函数地狱问题

    做法:每个Promise对象中管理一个异步任务,用then返回Promise对象,串联起来

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>Promise链式调用_解决回调地狱</title>
    8. </head>
    9. <body>
    10. <form>
    11. <span>省份:</span>
    12. <select>
    13. <option class="province"></option>
    14. </select>
    15. <span>城市:</span>
    16. <select>
    17. <option class="city"></option>
    18. </select>
    19. <span>地区:</span>
    20. <select>
    21. <option class="area"></option>
    22. </select>
    23. </form>
    24. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    25. <script>
    26. /**
    27. * 目标:把回调函数嵌套代码,改成Promise链式调用结构
    28. * 需求:获取默认第一个省,第一个市,第一个地区并展示在下拉菜单中
    29. */
    30. let pname = ''
    31. // 1. 得到-获取省份Promise对象
    32. axios({url: 'http://hmajax.itheima.net/api/province'}).then(result => {
    33. pname = result.data.list[0]
    34. document.querySelector('.province').innerHTML = pname
    35. // 2. 得到-获取城市Promise对象
    36. return axios({url: 'http://hmajax.itheima.net/api/city', params: { pname }})
    37. }).then(result => {
    38. const cname = result.data.list[0]
    39. document.querySelector('.city').innerHTML = cname
    40. // 3. 得到-获取地区Promise对象
    41. return axios({url: 'http://hmajax.itheima.net/api/area', params: { pname, cname }})
    42. }).then(result => {
    43. console.log(result)
    44. const areaName = result.data.list[0]
    45. document.querySelector('.area').innerHTML = areaName
    46. })
    47. </script>
    48. </body>
    49. </html>

    3.async函数和await

    定义:async函数是使用async关键字声明的函数。async函数是AsyncFunction构造函数的实例,并且其中允许使用await关键字。async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。

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

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>async函数和await_解决回调函数地狱</title>
    8. </head>
    9. <body>
    10. <form>
    11. <span>省份:</span>
    12. <select>
    13. <option class="province"></option>
    14. </select>
    15. <span>城市:</span>
    16. <select>
    17. <option class="city"></option>
    18. </select>
    19. <span>地区:</span>
    20. <select>
    21. <option class="area"></option>
    22. </select>
    23. </form>
    24. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    25. <script>
    26. /**
    27. * 目标:掌握async和await语法,解决回调函数地狱
    28. * 概念:在async函数内,使用await关键字,获取Promise对象"成功状态"结果值
    29. * 注意:await必须用在async修饰的函数内(await会阻止"异步函数内"代码继续执行,原地等待结果)
    30. */
    31. // 1. 定义async修饰函数
    32. async function getData() {
    33. // 2. await等待Promise对象成功的结果
    34. const pObj = await axios({url: 'http://hmajax.itheima.net/api/province'})
    35. const pname = pObj.data.list[0]
    36. const cObj = await axios({url: 'http://hmajax.itheima.net/api/city', params: { pname }})
    37. const cname = cObj.data.list[0]
    38. const aObj = await axios({url: 'http://hmajax.itheima.net/api/area', params: { pname, cname }})
    39. const areaName = aObj.data.list[0]
    40. document.querySelector('.province').innerHTML = pname
    41. document.querySelector('.city').innerHTML = cname
    42. document.querySelector('.area').innerHTML = areaName
    43. }
    44. getData()
    45. </script>
    46. </body>
    47. </html>

    4.async函数和await_捕获错误

    使用:try…catch,该语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。  

    语法:

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>async函数和await_错误捕获</title>
    8. </head>
    9. <body>
    10. <form>
    11. <span>省份:</span>
    12. <select>
    13. <option class="province"></option>
    14. </select>
    15. <span>城市:</span>
    16. <select>
    17. <option class="city"></option>
    18. </select>
    19. <span>地区:</span>
    20. <select>
    21. <option class="area"></option>
    22. </select>
    23. </form>
    24. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    25. <script>
    26. /**
    27. * 目标:async和await_错误捕获
    28. */
    29. async function getData() {
    30. // 1. try包裹可能产生错误的代码
    31. try{
    32. const pObj = await axios({ url: 'http://hmajax.itheima.net/api/province' })
    33. const pname = pObj.data.list[0]
    34. const cObj = await axios({ url: 'http://hmajax.itheima.net/api/city', params: { pname } })
    35. const cname = cObj.data.list[0]
    36. const aObj = await axios({ url: 'http://hmajax.itheima.net/api/area', params: { pname, cname } })
    37. const areaName = aObj.data.list[0]
    38. document.querySelector('.province').innerHTML = pname
    39. document.querySelector('.city').innerHTML = cname
    40. document.querySelector('.area').innerHTML = areaName
    41. } catch (error) {
    42. // 2. 接着调用catch块,接收错误信息
    43. // 如果tr里某行代码报错后,try中剩余的代码就不会执行了
    44. console.dir(error)
    45. }
    46. getData()
    47. </script>
    48. </body>
    49. </html>

  • 相关阅读:
    vue使日历组件点击时间渲染到时间输入框
    OneFlow如何做静态图的算子对齐任务
    PyQt5_QScrollArea内容保存成图片
    Python基础:输入输出详解-输出字符串格式化
    程序调试技巧
    端到端的机器学习项目(Machine Learning 研习之六)
    2.5 Regression
    混淆矩阵绘制
    新发布的Java使用率均超Java8
    Docker容器数据卷入门教程(超详细)
  • 原文地址:https://blog.csdn.net/weixin_48719464/article/details/138081196