0

0

JavaScript中async与await异步函数的底层执行逻辑

冰川箭仙

冰川箭仙

发布时间:2026-03-16 20:31:03

|

421人浏览过

|

来源于php中文网

原创

async/await 是 Promise 的语法糖,底层基于 Promise 和微任务队列运行;async 函数必返回 Promise,await 将后续代码包装为微任务,在当前宏任务结束后执行。

javascript中async与await异步函数的底层执行逻辑

async/await 不是新创建的异步机制,而是 Promise 的语法糖,其底层完全基于 Promise 和微任务队列(microtask queue)运行,执行逻辑严格遵循 JavaScript 的事件循环模型。

async 函数返回的是 Promise 对象

声明一个 async 函数时,JavaScript 引擎会自动将其包装为返回 Promise 的函数:

  • 若函数正常返回值 v,等价于 Promise.resolve(v)
  • 若函数抛出异常 e,等价于 Promise.reject(e)
  • 即使函数体内没有 await,也一定返回 Promise —— 这是 async 的强制语义。

await 暂停执行但不阻塞线程

await 后面的表达式会被立即求值。如果结果是 Promise,则当前 async 函数的执行上下文被挂起,控制权交还给调用者;该 Promise 进入微任务队列等待解决。关键点在于:

  • await 并非“让出线程”,而是将后续代码(即 await 之后的语句)包装成一个 then 回调,注册为微任务;
  • 这个微任务会在当前宏任务(如 script、setTimeout 回调)结束后、下一轮宏任务开始前执行;
  • await 后的代码不会在当前调用栈中继续执行,而是等到 Promise settled 后,在微任务阶段恢复执行上下文。

执行顺序由事件循环精确控制

下面这段代码能清晰体现底层调度逻辑:

叮当好记-AI音视频转图文
叮当好记-AI音视频转图文

AI音视频转录与总结,内容学习效率 x10!

下载

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

async function foo() {
  console.log('1');
  await Promise.resolve();
  console.log('2');
}
console.log('a');
foo();
console.log('b');

输出顺序是:a → 1 → b → 2。原因如下:

  • 同步代码 'a' 和 'b' 在主 script 宏任务中立即执行;
  • foo 内部 '1' 是同步执行的;
  • await Promise.resolve() 触发微任务注册(即 console.log('2') 的回调);
  • 主 script 宏任务结束后,清空微任务队列,执行 '2'。

错误处理本质是 Promise.catch

try/catch 在 async 函数中能捕获 await 后 Promise 的 rejection,是因为:

  • await 表达式内部等价于 .then(onFulfilled).catch(onRejected)
  • 引擎将 catch 块自动绑定到 await 所在 Promise 的拒绝路径上;
  • 未被捕获的 await 错误最终表现为 async 函数返回的 Promise 被 reject,可被外层 .catch() 或顶层 unhandledrejection 监听。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

420

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

544

2024.05.29

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

500

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

167

2023.10.07

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

339

2023.10.12

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号