javascript中的async/await是什么_怎样简化异步代码

13次阅读

async/await 是 promise 的语法糖,async 函数必返回 Promise,await 只能在 async 函数内使用;独立异步操作应优先用 Promise.all 并行,避免无依赖的串行 await 拖慢性能。

javascript中的async/await是什么_怎样简化异步代码

async/await 是 javaScript 中用来写异步代码的语法糖,本质就是 Promise 的封装,它不改变异步行为,但让代码读起来像同步——await 会“暂停”当前函数执行(仅逻辑上),等 Promise 完成后再继续,而不会阻塞整个线程

async 函数为什么必须返回 Promise?

只要用 async 声明函数,无论有没有 await、有没有 return,它就自动返回一个 Promise:

  • 显式 return 42 → 等价于 Promise.resolve(42)
  • 抛出错误 throw new Error() → 等价于 Promise.reject(...)
  • 没写 return → 返回 Promise.resolve(undefined)

这意味着调用方必须用 .then() 或外层 await 处理结果,不能直接取值。

async function getValue() {   return "hello"; } console.log(getValue()); // Promise {: "hello"} getValue().then(console.log); // 输出: "hello"

await 只能在 async 函数里用,否则报错

这是硬性限制,不是风格建议。下面这些写法都会触发 SyntaxError: await is only valid in async functions

立即学习Java免费学习笔记(深入)”;

  • function foo() { await fetch('/api'); }(普通函数)
  • [1,2].forEach(() => { await delay(100); })(箭头函数非 async)
  • setTimeout(() => { await doAsync(); }, 100)回调函数

正确做法:把逻辑包进 async 函数,或改用 for...of 配合 await

async function runInSequence() {   for (const item of ['a', 'b', 'c']) {     const res = await fetch(`/api/${item}`);     console.log(await res.json());   } }

别把独立请求写成串行 await,那是性能杀手

连续写多个 await 看似清晰,但如果它们之间没有依赖关系,实际是「一个接一个发请求」,耗时叠加:

// ❌ 串行:总耗时 ≈ 1000ms + 800ms = 1800ms const user = await fetchUser(); const posts = await fetchPosts();  // ✅ 并行:总耗时 ≈ max(1000ms, 800ms) = 1000ms const [user, posts] = await Promise.all([fetchUser(), fetchPosts()]);

常见误判点:

  • Promise.all 中任意一个 Promise reject,整个就会失败 → 需要提前兜底或用 Promise.allSettled
  • 如果后续逻辑依赖前一步结果(比如用 Token 换用户信息),才必须串行 await

最常被忽略的一点:await 不是“让 JS 变同步”,它只是让开发者不用手动写 .then() 链;底层仍是事件循环 + 微任务队列。写错位置(比如在循环里盲目 await)或漏掉 try/catch,轻则逻辑中断,重则未捕获异常导致静默失败。

text=ZqhQzanResources