第29篇:async/await 终极异步方案——彻底抹平回调,写出同步质感的异步代码
前言在前两篇中我们掌握了Promise 链式调用成功解决了传统回调地狱问题。但是 Promise 依然存在小缺陷多层链式调用依然存在“分段割裂”逻辑较长时代码阅读依然不够直观无法像同步代码一样自上而下顺序书写所以 ES2017 推出async / await它是Promise 的语法糖也是目前前端工程唯一主流异步写法。它的核心价值只有一句话让异步代码写起来像同步代码。本篇高质量吃透 async/await重构博客所有网络请求统一项目代码风格对标企业真实项目规范。一、核心原理async/await 是什么async修饰函数让普通函数变成「异步函数」返回值自动包装为 Promise。await等待 Promise 执行完毕阻塞当前代码拿到最终结果。关键点await 只能在 async 函数内部使用。二、基础语法对比直观感受质变传统 Promise 链式写法getList() .then(res getDetail(res.id)) .then(detail console.log(detail)) .catch(err console.log(err))async/await 终极写法async function init(){ const list await getList(); const detail await getDetail(list.id); console.log(detail); }代码自上而下、顺序执行、逻辑清晰完全和同步代码一致。三、错误捕获标准方案 try/catchasync/await 没有自带 catch必须使用try/catch捕获异常这是企业开发强制规范。async function loadData(){ try{ // 所有异步成功逻辑写这里 const res await http(https://jsonplaceholder.typicode.com/posts); console.log(请求成功,res); }catch(err){ // 任意步骤报错统一捕获 console.log(请求失败,err); } }优势统一异常处理、代码干净、便于维护、适合大型项目。四、博客项目高质量实战重构我们将博客「页面初始化、接口请求、数据渲染」全部升级为 async/await 标准写法彻底工程化。// 入口函数项目初始化 async function initBlog(){ // 开启加载 loading.style.display block; try{ // 1. 异步获取文章列表 const articleList await http(/posts); // 2. 截取数据、处理格式 const showList articleList.slice(0,6); // 3. 页面渲染 renderArticle(showList); }catch(err){ // 全局错误兜底 articleList.innerHTML p数据加载失败请稍后重试/p; console.error(博客初始化失败,err); }finally{ // 无论成功失败都会关闭加载 loading.style.display none; } } // 执行初始化 initBlog();新增finally无论成功失败关闭 loading解决 loading 卡死bug商用项目必备。五、高级考点串行与并行精准控制1. 串行请求默认一个执行完再执行下一个适合接口依赖场景const a await http(接口1); const b await http(接口2);2. 并行请求性能优化重点无依赖接口同时请求大幅缩短页面加载时间面试高频优化点// 同时发起多个请求 const [res1, res2] await Promise.all([ http(接口1), http(接口2) ])六、面试高频问答必背1. async/await 和 Promise 的关系async/await 是 Promise 的语法糖没有改变 Promise 本质只是让写法更优雅。底层依旧是微任务异步执行。2. await 是阻塞吗只阻塞当前 async 函数内部代码不会阻塞主线程外部代码依旧正常执行。3. 为什么要用 try/catchasync/await 报错会直接终止程序必须手动捕获异常保证项目稳定性。七、本篇结语学完本篇你已经掌握了现代前端最终极的异步编程方案。从原始回调 Promise 链式 async/await 同步式写法你完整走完了前端异步进化全链路。目前你的项目代码规范、优雅、稳定、可维护完全对标企业初级前端项目标准。下一篇整套系列高质量最终收官篇前端全套性能优化高阶汇总把你项目的亮点、优化点、工程化能力全部拉满直接对标面试中级水平。