[4-3] 异步编程与事件循环 · 终极异步解决方案 (Generator & Async/Await)

所属板块:4. 异步编程与事件循环

记录日期:2026-03-xx

更新:遇到 async/await 输出题或并发控制题时补充

1. Generator 函数(过渡期方案)

Generator 是 ES6 引入的"可暂停/恢复执行"的函数,用 function* 定义,yield 暂停。

js 复制代码
function* gen() {
  yield 1;
  yield 2;
  return 3;
}

const g = gen();
console.log(g.next());   // { value: 1, done: false }
console.log(g.next());   // { value: 2, done: false }
console.log(g.next());   // { value: 3, done: true }

它本身不能直接处理异步,但结合执行器(如 co 库)可以实现异步流程控制,为 async/await 铺路。

2. async/await 的本质(Generator + Promise 语法糖)

async/await 是 Generator + Promise 的语法糖:

  • async 函数的返回值一定是一个 Promise
  • await 后面如果不是 Promise,会被自动 Promise.resolve() 包装
  • await 下方的代码会被包装成 .then() 回调,推入微任务队列(结合 4-1 事件循环)
js 复制代码
async function test() {
  console.log("1");
  await Promise.resolve("await");
  console.log("2");
}

test();
console.log("3");

输出:1 → 3 → 2(await 转为微任务)

3. await 在 Event Loop 中的真实表现(极其重要)

  • await 右侧表达式同步执行
  • await 下方的所有代码被包装成微任务
  • 如果 await 的是已 resolved 的 Promise,仍会推入微任务队列(不会立即执行)

经典对比:

js 复制代码
async function asyncFunc() {
  console.log("async start");
  await Promise.resolve();
  console.log("async end");
}

asyncFunc();
console.log("global");

输出:async start → global → async end

4. 实战场景与错误处理

推荐写法(try...catch)

js 复制代码
async function fetchData() {
  try {
    const res = await fetch('/api');
    const data = await res.json();
    return data;
  } catch (err) {
    console.error("请求失败", err);
  }
}

并发优化误区(最容易踩坑)

js 复制代码
// 错误写法:串行执行
for (const url of urls) {
  const data = await fetch(url);   // 一个接一个
}

// 正确写法:先并发启动,再 await
const promises = urls.map(url => fetch(url));
const results = await Promise.all(promises);

5. 小结 & 第四板块完结

  • Generator 是"可暂停函数",async/await 是其语法糖 + Promise 结合
  • await 本质是微任务调度(必须结合 4-1 事件循环理解)
  • 4-1 事件循环 + 4-2 Promise + 本文 async/await,共同构成了 JS 异步编程的完整体系

第四板块(异步编程与事件循环)到此全部结束。

这是 JS 单线程下最核心的"动态调度机制",掌握后刷输出题和写并发代码会非常顺手。

返回总目录:戳这里

相关推荐
必须会一定会1 小时前
用纯 HTML/JS 做一个 AI 需求澄清器:把模糊想法转换成可执行任务书
开发语言·前端·javascript·人工智能·html·ai编程
小帅不太帅1 小时前
1.5M 参数的 OCR 模型,我把它跑进了浏览器
前端·javascript·ai编程
avi911114 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
kyriewen14 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
用户9385156350715 小时前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
油丶酸萝卜别吃16 小时前
jquery-ajax.js 说明文档
前端·javascript·jquery
windliang16 小时前
Claude Code 源码分析(九):子 Agent 如何分叉、继续与回到父会话
前端·javascript·面试
柒和远方16 小时前
V063: TS 面试必考:interface 与 type 的四大差异,与 LLM Harness 的自动化择优
前端·javascript
汉堡大王952717 小时前
Vue 3 + TS + Element Plus 实战:如何从零搭建企业级违章记录管理 SaaS 前端
前端·javascript·vue.js
海天鹰17 小时前
屏幕颜色检测
javascript·html5