async/await 是基于 Promise 和生成器的语法糖,使异步代码更线性易读。1. async 函数自动返回 Promise,2. await 暂停函数执行并等待 Promise 完成,3. 错误可用 try/catch 捕获,4. await 后的 Promise 被加入微任务队列,遵循事件循环机制。

async/await 是 JavaScript 中处理异步操作的一种语法糖,它让异步代码看起来像同步代码,提升了可读性和可维护性。其底层依赖于 Promise 和生成器(Generator)机制,理解它的原理有助于写出更健壮的异步逻辑。
一个用 async 声明的函数会自动返回一个 Promise 对象。即使函数体中没有显式返回 Promise,JavaScript 也会将其包装成已解决(resolved)的 Promise。
例如:
async function getData() {
return 'hello';
}
// 等价于
function getData() {
return Promise.resolve('hello');
}
如果 async 函数抛出异常,返回的 Promise 将处于 rejected 状态。
立即学习“Java免费学习笔记(深入)”;
await 只能在 async 函数内部使用,它的作用是暂停函数执行,直到右侧的 Promise 被 resolve 或 reject。
虽然代码看起来是“阻塞”的,但实际上是通过事件循环机制实现的非阻塞等待。JavaScript 引擎并不会真正卡住,而是将控制权交还给事件循环,待 Promise 完成后再恢复执行。
await 的实现可以类比于 Generator 函数配合 yield 使用,并由自动执行器(如 co 模块)驱动。现代 JS 引擎将 async/await 编译为基于 Promise 和状态机的结构。
使用 await 时,Promise 的 rejection 会以异常形式抛出,因此可以用 try/catch 捕获。
async function fetchData() {
try {
const res = await fetch('/api/data');
const data = await res.json();
return data;
} catch (err) {
console.error('请求失败:', err);
}
}
这比链式 .then/.catch 更直观,尤其在处理多个异步步骤时能有效避免回调嵌套。
因为 await 后面的表达式一旦是 Promise,就会被放入微任务队列,所以 async/await 的执行时机遵循 Promise 的微任务规则。
示例:
console.log(1);
async function f() {
console.log(2);
await Promise.resolve();
console.log(4);
}
f();
console.log(3);
// 输出:1 2 3 4
其中 console.log(4) 在当前宏任务结束后、下一个宏任务开始前执行,因为它属于微任务回调。
基本上就这些。async/await 让异步编码更线性,但本质仍是 Promise 的封装,理解其背后机制才能更好应对并发、错误和执行时序问题。
以上就是JavaScript异步编程_async/await原理的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号