async/await 是 Promise 与事件循环协作的显式表达,async 函数必返回 Promise,await 只能在 async 函数内使用,它让出控制权而非阻塞线程,错误需显式处理,调试时执行流不连续。

async/await 不是语法糖的简单包装,而是 Promise 与事件循环协作的显式表达方式——它不改变异步本质,只改变你组织代码的方式。
async 函数返回值总是 Promise
哪怕你 return 42,函数实际返回的是 Promise.resolve(42);如果抛出错误,则等价于 Promise.reject(error)。这意味着调用 async 函数后必须用 .then() 或 await 处理,不能直接取值。
- 错误写法:
const val = myAsyncFn()→val是 Promise,不是 42 - 正确写法:
const val = await myAsyncFn()(在 async 上下文中)或myAsyncFn().then(v => ...) - 即使函数体内没有
await,也仍会自动包装返回值,这是async的强制语义
await 只能在 async 函数内部使用
试图在普通函数或顶层模块作用域中写 await fetch('/api') 会触发 SyntaxError: await is only valid in async function。这不是限制,而是设计约束:await 需要一个可以暂停/恢复的执行上下文,而只有 async 函数才提供这个上下文。
- 常见误操作:在
if块、for循环或setTimeout回调里直接写await,却忘了包裹它的函数本身没加async - 修复方法:把包含
await的逻辑提取到独立async函数,或给当前函数加上async前缀 - ES2022 起支持顶层
await(仅限 ES 模块),但 Node.js 或打包工具需明确启用,不可默认假设可用
await 暂停的是当前函数,不是整个线程
JavaScript 仍是单线程,await 不会阻塞事件循环。它只是让出控制权,等 Promise settled 后再从暂停点继续执行该函数——其余代码(比如其他定时器、网络响应、用户交互)照常运行。
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
立即学习“Java免费学习笔记(深入)”;
- 典型误解:“await sleep(1000) 会让页面卡住 1 秒” → 实际上只是当前函数暂停,UI 渲染、其他回调不受影响
- 并发注意:连续写
await a(); await b();是串行;想并行应改用await Promise.all([a(), b()]) - 错误处理需显式:未被
try/catch包裹的await抛错会直接 reject 所在 async 函数的返回 Promise,上游若不处理就会变成 unhandled rejection
调试时 await 行为不像同步代码那样“直下”
Chrome DevTools 或 VS Code 调试器中,单步执行遇到 await 会跳到 Promise resolve/reject 后的位置,中间可能跨过大量其他任务(比如另一个 setTimeout 回调)。这容易让人误判执行顺序。
- 现象:在
await fetch()下一行打断点,但先触发了某个click事件回调 → 这是正常的,因为 fetch 网络耗时,事件循环早已调度了其他任务 - 建议:调试异步流时,优先看 Promise 链和
console.timeLog,而非依赖单步“视觉连续性” - 真正难缠的是隐式状态依赖:比如两个
await操作共用同一个对象引用,而中间被其他异步回调修改了——这种 bug 不由 await 引起,但 await 让时序更难追踪










