黑马学习笔记_async 函数和 await
async 函数是 AsyncFunction 构造函数的实例,并且其中允许使用 await 关键字。
async 和 await 关键字让我们可以用一种更简洁的方式写出基于 Promise 的异步行为,而无需刻意地链式调用 promise。
讲解
-
概念:在 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()
【NOTE】
axios 原地返回一个 Promise 对象。
可以使用 await 替代 then
【IMPORTANT】
Q: await 的作用是什么?
A: 替代 then 方法来提取 Promise 对象成功状态的结果
async 函数和 await _捕获错误
讲解
-
try 和 catch 的作用:语句标记要尝试的语句块,并指定一个出现异常时抛出的响应
try { // 要执行的代码 } catch (error) { // error 接收的是,错误消息 // try 里代码,如果有错误,直接进入这里执行 }
try 里有报错的代码,会立刻跳转到 catch 中
-
尝试把代码中 url 地址写错,运行观察 try catch 的捕获错误信息能力
/** * 目标: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) { console.dir(error) } } getData()
【NOTE】
try 块中某行代码报错,调用catch块,接收错误信息。
如果 try 中某行代码报错后,错误位置后面剩余的代码将不会执行。
【TIP】
Q:
console.log
和console.dir
有什么区别?A:
log
语句打印的是结果,直接显示信息;dir
语句打印的是内容,显示对象的所有属性和方法。