概念:依靠then()方法会返回一个新生成的Promise对象特性,继续串联下一环任务,知道结束
细节:then()回调函数中的返回值,会影响新生成的Promise对象最终状态和结果
好处:通过链式调用,解决回调函数嵌套问题
- <!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>Promise_链式调用</title>
- </head>
-
- <body>
- <script>
- /**
- * 目标:掌握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对象
- return new Promise((reselve,reject) => {
- setTimeout(() => {
- resolve(result + '--- 北京')
- },2000)
- })
- })
-
- // 4.获取城市名字
- p2.then(result => {
- console.log(result)
- })
- // then()函数的结果是一个新的Promise对象
- console.log(p2 === p)
- </script>
- </body>
-
- </html>
目标:使用Promise链式调用,解决回调函数地狱问题
做法:每个Promise对象中管理一个异步任务,用then返回Promise对象,串联起来

- <!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>Promise链式调用_解决回调地狱</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>
- /**
- * 目标:把回调函数嵌套代码,改成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>
- </body>
-
- </html>
定义:async函数是使用async关键字声明的函数。async函数是AsyncFunction构造函数的实例,并且其中允许使用await关键字。async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。
概念:在async函数内,使用await关键字取代then函数,等待获取Promise对象成功状态的结果值

- <!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会阻止"异步函数内"代码继续执行,原地等待结果)
- */
- // 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()
- </script>
- </body>
-
- </html>
使用:try…catch,该语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。
语法:
- <!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 function getData() {
- // 1. try包裹可能产生错误的代码
- try{
- 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
- } catch (error) {
- // 2. 接着调用catch块,接收错误信息
- // 如果tr里某行代码报错后,try中剩余的代码就不会执行了
- console.dir(error)
- }
-
- getData()
- </script>
- </body>
-
- </html>