async/await|JS同步写法解决异步终极方案

一、async/await 核心本质

async/await 不是新功能,是 Promise 的语法糖。

  • async:修饰函数,标记该函数为异步函数,返回值自动包装为 Promise

  • await :等待 Promise 执行完毕,只能写在 async 函数内部

核心价值:异步任务、同步顺序执行,代码结构和普通同步逻辑完全一致。


二、基础语法使用

复制代码

// 1. 封装一个 Promise 异步任务 function delay(time, val) { return new Promise((resolve) => { setTimeout(() => { resolve(val); }, time); }); } // 2. async 函数 + await 等待结果 async function fn() { // 阻塞等待 Promise 执行完成,拿到结果 let res1 = await delay(1000, "第一步数据"); console.log(res1); let res2 = await delay(1000, "第二步数据"); console.log(res2); } fn();

执行顺序:从上到下,执行完上一个异步再走下一个,完全同步写法。


三、异步函数返回值特点

任何被 async 修饰的函数,返回结果一定是 Promise 对象。

复制代码

async function test() { return 666; } // 自动包装成 Promise test().then(res => console.log(res)); // 666


四、异常捕获 try / catch(必学)

await 遇到 Promise 失败(reject)会直接报错、终止代码。必须使用 try/catch 捕获异常。

复制代码

async function getData() { try { // 成功走这里 let res = await fetch("https://xxx/api"); console.log("请求成功", res); } catch (err) { // 失败、报错走这里 console.log("请求失败", err); } } getData();

工程规范:所有 await 业务代码,必须包裹 try/catch,防止页面逻辑崩掉。


五、串行异步(默认行为)

多个 await 默认 串行执行,上一个结束才执行下一个,适合有依赖顺序的接口。

复制代码

async function serial() { console.time("串行耗时"); await delay(1000, 1); await delay(1000, 2); await delay(1000, 3); console.timeEnd("串行耗时"); // 总耗时约 3000ms } serial();


六、并行异步(提升性能)

无依赖的异步任务,不要顺序等待!搭配 Promise.all 实现并行执行,大幅提速。

复制代码

async function parallel() { console.time("并行耗时"); // 先同时开启所有任务 const p1 = delay(1000, 1); const p2 = delay(1000, 2); const p3 = delay(1000, 3); // 统一等待结果 const res = await Promise.all([p1, p2, p3]); console.log(res); console.timeEnd("并行耗时"); // 总耗时约 1000ms } parallel();


七、开发核心注意要点

  • await 必须写在 async 函数内,普通函数直接报错

  • await 只能等待 Promise、不能等待普通值

  • 串行有顺序依赖,并行提升性能,根据业务场景选择

  • 所有异步请求必须 try/catch,统一异常处理

  • async/await 只是语法糖,底层依旧是 Promise

相关推荐
蜗牛攻城狮2 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀3 小时前
Vue插槽
前端·javascript·vue.js
qq_448011164 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan4 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352904 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝5 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing036 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel6 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放6 小时前
Python基础语法练习题(73)
java·前端·python
风骏时光牛马7 小时前
面向复杂场景的大模型应用落地与能力优化实践
前端