极简三分钟ES6 - ES8中async,await

基础概念:快递员与包裹

想象我们要接收两个快递

  • 传统回调/Promise :反复查物流(.then()嵌套),流程繁琐
  • async/await :告诉快递员(async函数)"到了叫我"(await),那我们就能专心做其他事
js 复制代码
// 传统 Promise 链 
fetchData()
  .then(data => process(data))
  .then(result => console.log(result)) 
  .catch(err => console.error(err)); 
 
// async/await 写法 
async function handleData() {
  try {
    const data = await fetchData(); // 等包裹送达 
    const result = await process(data); // 拆包裹后加工 
    console.log(result); 
  } catch (err) {
    console.error(err);  // 包裹异常统一处理 
  }
}

使用规则详解

async 标记异步函数

函数前加 async自动返回 Promise 对象

js 复制代码
async function getNum() { return 42; }
getNum().then(num => console.log(num));  // 输出 42 

await 暂停等待结果

async 函数内使用,暂停代码执行直到右侧表达式完成

js 复制代码
async function demo() {
  console.log(" 开始等待");
  await new Promise(resolve => setTimeout(resolve, 2000)); // 等 2 秒 
  console.log(" 等待结束");
}

错误处理:try/catch 替代 .catch()

用同步语法捕获异步错误

js 复制代码
async function fetchUser() {
  try {
    const user = await fetch("/api/user");
    console.log(user); 
  } catch (error) {
    console.error(" 请求失败:", error);
  }
}

解决四大痛点

痛点场景 async/await 方案 传统方案问题
回调地狱 扁平化代码结构 多重嵌套难维护
Promise 链中断 try/catch 直接捕获错误 需每个 .then() 后接 .catch()
同步取值困难 const res = await asyncTask() 需在 .then() 内操作
条件分支处理复杂 直接写 if/else 逻辑 链式调用分支混乱

一些常见的使用场景

按顺序调用多个接口

js 复制代码
async function initPage() {
  const user = await getUserInfo();      // 等用户数据 
  const orders = await getOrders(user.id);  // 用用户ID查订单 
  renderPage(user, orders);              // 渲染页面 
}

循环中的异步操作

js 复制代码
async function batchDownload(urls) {
  for (const url of urls) {
    const data = await download(url); // 等上一个下载完 
    saveToDisk(data);
  }
}

并行优化:Promise.all 搭配使用

js 复制代码
async function loadAll() {
  const [news, ads] = await Promise.all([ 
    fetchNews(),
    fetchAds()
  ]); // 同时发请求,等全部返回 
  return { news, ads };
}

牢记

"async 造个快递员,await 坐等不焦虑,错误抓进 try/catch,异步同步两相宜。"

相关推荐
爱勇宝2 小时前
大多数人不是在使用 AI 赚钱,而是在帮 AI 公司赚钱
前端·后端·程序员
冬奇Lab3 小时前
每日一个开源项目(第143篇):page-agent - 纯 JS 的网页 GUI Agent,无需截图、无需插件、无需后端
前端·人工智能·agent
To_OC4 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
IT_陈寒7 小时前
React的这个渲染问题连官方文档都没说清楚
前端·人工智能·后端
追逐时光者8 小时前
别再满网找零散工具了,腾讯 QQ 浏览器这个“帮小忙”工具箱真能省时间
前端·后端
To_OC10 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
Asmewill10 小时前
grep&curl命令学习笔记
前端
stringwu11 小时前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter
用户21366100357212 小时前
Vue2组件化开发与父子通信
前端·vue.js
Momo__12 小时前
TypeScript satisfies 操作符——比 as 更安全的类型守门员
前端·typescript