async/await是用同步风格编写异步逻辑的语法糖,不改变异步本质;async函数自动返回Promise,await仅在async函数内暂停执行并等待Promise落定,需用try/catch处理错误,多请求应使用Promise.all([p1,p2])并行而非串行。

async/await 不是让异步变同步,而是用同步风格写异步逻辑——它不阻塞线程,也不改变异步本质,只是让代码更易读、更易维护。
async 函数:自动返回 Promise
加了 async 的函数,无论内部写什么,返回值都会被自动包装成 Promise。如果 return 一个普通值,比如 return 42,实际等价于 return Promise.resolve(42);如果抛错,等价于 return Promise.reject(err)。
不能用 await 在普通函数或顶层作用域(ES2022 之前)中直接写 async function foo() {} 和 const foo = async () => {} 行为一致
await:暂停执行,等待 Promise 落定
await 只能在 async 函数内使用,它会让 JS 引擎“暂停”当前函数的执行(注意:不是卡住线程),等右侧的 Promise 成功 resolve 后,再把结果作为表达式的值继续往下走。如果 Promise 被 reject,就相当于 throw 了一个错误,可以用 try/catch 捕获。
const data = await fetch('/api').then(r => r.json()) ✅ 可以,但没必要——await 本身已处理 then const data = await fetch('/api').json() ❌ 错误,fetch() 返回 Promise,.json() 是方法调用,不是 Promise 正确写法:const res = await fetch('/api'); const data = await res.json();
错误处理:用 try/catch,别靠 .catch
await 后的 Promise 如果 reject,会直接冒泡成异常。所以推荐用 try/catch 包裹,语义清晰,也方便捕获中间多个 await 的错误。
立即学习“Java免费学习笔记(深入)”;
避免这样:getData().catch(handleError) —— 失去了 await 的链式可读性 推荐这样:try { const a = await step1(); const b = await step2(); } catch (e) { handleError(e); } 多个并行请求?用 Promise.all([await p1, await p2]) 是错的——会串行。应写成 await Promise.all([p1, p2])
它没解决的根本问题:异步仍是异步
await 不会让 API 请求变快,也不会让 setTimeout 立刻执行。它只是语法糖,底层仍是事件循环和微任务队列。你写的“看起来像同步”的代码,执行时依然受制于网络延迟、I/O 耗时等现实约束。
await 后面如果不是 Promise,会被自动转成 Promise.resolve(value),所以 await 123 是合法的,但没实际意义 想“真正同步”执行耗时操作?JS 里没有(除 Web Workers 或 Deno 的某些扩展外),也不该有——这违背单线程非阻塞的设计哲学
基本上就这些。async/await 是组织异步逻辑的利器,不是魔法开关。用对了,代码清爽;用错了,反而掩盖回调地狱的本质问题。
以上就是什么是async/await_javascript中异步代码如何同步化?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1543615.html
微信扫一扫
支付宝扫一扫