深入理解 JavaScript 的 `async/await`

await原理 js_「前端进阶」完全吃透async/await,深入JavaScript异步 释放双眼,带上耳机,听听看~!完全吃透async/await0. 前言ES7 提出的async 函数,终于让 JavaScript 对于异步操作有了终极解决方案。No more callback hell。async 函数是 Generator 函数的语法糖。使用 关键字 async 来表示,在函数内部使用 await 来表示异步。想较于 Generator,Async 函数的改进在于下面四点:内... 阅读详情

async/await 是 JavaScript 中处理异步操作的重要工具,它建立在 Promise 的基础之上,并且与 Promise 的 API 完全兼容。本文将从基础概念、优势以及底层原理等多个角度,带你全面了解 async/await。


什么是 async/await?

async/await 是 generator 函数的语法糖,它让异步代码的书写更加直观,接近同步代码的风格。

async 的作用

  1. 声明异步函数:通过 async function Fn() {} 声明一个异步函数。
    • 自动将普通函数转换为 Promise,返回值也是一个 Promise 对象。
    • 只有异步函数内部的所有异步操作完成后,才会触发 then 方法指定的回调函数。
    • 异步函数内部可以使用 await。

await 的作用

  1. 暂停异步操作:await 用于暂停异步代码的执行,直到 Promise 完成并返回结果。
    • 它强制其他代码等待,直到 Promise 完成。
    • 只能与 Promise 一起使用,不适用于回调函数。
    • 只能在 async 函数内部使用。

为什么选择 async/await?

相比于传统的 Promise,async/await 提供了以下优势:

  1. 代码更易读

    • Promise 虽然解决了回调地狱的问题,但链式调用的 then 方法仍然会增加阅读负担。
    • async/await 的写法接近同步代码,逻辑更加清晰。
  2. 中间值传递更简单

    • 在 Promise 链中传递中间值较为繁琐,而 async/await 可以通过变量轻松保存中间结果。
  3. 错误处理更友好

    • async/await 可以使用成熟的 try/catch 机制捕获错误,而 Promise 的错误捕获需要额外的 catch 方法,显得冗余。
  4. 调试更方便

    • 使用 async/await 时,调试器可以逐步跟踪每一行代码,而在 Promise 链中,调试器无法进入后续的 then 块。

async/await 的底层原理

1. 语法糖的含义

“语法糖”指的是一种更简洁、更易读的语法形式,但其底层实现与已有功能类似。async/await 是对 generator 和 Promise 的封装,使得异步代码的书写更加直观。

2. generator 函数的工作原理

generator 函数通过 yield 暂停代码执行,并通过 next() 恢复执行。它本质上是一个可以暂停和恢复的函数,非常适合处理异步流程。

示例:使用 generator 和 Promise 模拟异步操作:

function* generatorFn() {
  const result = yield new Promise((resolve) => setTimeout(() => resolve(42), 1000));
  console.log(result); // 输出 42
}

const gen = generatorFn();
const promise = gen.next().value; // 执行到第一个 yield,返回 Promise
promise.then((res) => gen.next(res)); // 恢复执行,并传入结果

3. async/await 的实现原理

async/await 的底层实现类似于 generator,但它自动处理了 Promise 的调用和结果传递,简化了代码。

等价的 async/await 写法:

async function asyncFn() {
  const result = await new Promise((resolve) => setTimeout(() => resolve(42), 1000));
  console.log(result); // 输出 42
}
asyncFn();

4. 对比 async/await 和 generator

特性async/awaitgenerator
暂停代码执行awaityield
异步操作处理自动处理 Promise需要手动调用 next()
返回值返回一个 Promise返回一个迭代器
使用复杂度简单易用需要额外处理逻辑

总结

async/await 是对 generator 的封装,它隐藏了 Promise 和迭代器的复杂性,使得异步代码更易读、更易写。可以将 async/await 理解为一种更高级的 generator 用法。

通过本文的介绍,相信你对 async/await 的概念、优势以及底层原理有了更深入的理解。希望你能在实际开发中灵活运用它,编写出更优雅的异步代码!

【3期】javascript的this指向-完整场景 目录 默认绑定 隐式绑定 显式绑定 new绑定 默认绑定 全局环境中,this默认绑定到window 在控制台中分别执行以下代码,注意,全局变量相当于window对象的属性 <1> console.log(this==window) // true <2> var a={ foo:"123", bar:"456", that:this } a.that // window <3> this // window 函数独立调用或者被嵌套函数独立调用时. 阅读详情

相关推荐

深入理解 `Promise`、`async/await` 与异步请求:以 `uni.request` 和 `axios` 为例

在现代 Web 开发中,异步操作是非常常见的需求,尤其是在进行 HTTP 请求时。是 JavaScript 中的语法糖,主要用于简化异步代码的书写,使得异步操作看起来像是同步代码,避免了传统回调函数和。和现代的异步请求方式,你可以写出更易读、更具可维护性的代码,避免传统的回调地狱和异步代码难以管理的问题。它代表了一个异步操作的最终完成(成功或失败),并允许我们在异步操作完成后处理结果。中的 HTTP 请求方法,它本身是基于回调的异步请求,并不会直接返回一个。,使得异步操作的处理更加直观,特别是与。

劲雨波 1565

理解async和await

async 是“异步”的简写,而 await 可以认为是 async wait 的简写。 所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。 async 函数是什么?一句话,它就是 Generator 函数的语法糖。async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成a...

awn80645的博客 840

AI编程助手深度对比:Codex与Claude Code的核心差异与实战指南

最近在技术社区里,经常能看到“小龙虾”、“Codex”、“Claude Code”这些词被开发者挂在嘴边。如果你刚接触这些概念,可能会一头雾水:它们到底是新的编程语言、框架,还是某种神秘的开发工具?为什么大家都在讨论?更重要的是,它们能解决我写代码时的哪些实际问题? 简单来说, Codex 和 Claude Code 是目前最受关注的两款 AI 编程助手(Agent),它们正在从根本上改变开发者与代码的交互方式 。它们不再是简单的代码补全工具,而是能理解复杂上下文、执行多步骤任务、甚至自主调用外部工具的“编

weixin_30599769的博客 519

Javascript——async、await详解

async、await

weixin_43551242的博客 1万+

JS中的异步async-await(秒懂异步编程模式)

异步编程是一种编程模式,用于处理程序中需要长时间等待的操作,比如网络请求、文件读写、定时器等。在传统的同步编程模式下,程序会按照顺序一步步执行,如果遇到需要耗时的操作,程序会阻塞等待操作完成,直到操作完成后才能继续执行后续代码。异步编程模式是一种用于处理异步操作的编程范例,其核心目标是提高程序的效率和性能,同时保持代码简洁易读。回调函数最基本的异步编程模式,通过将函数作为参数传递给异步操作,在操作完成时调用该函数。容易导致回调地狱(Callback Hell),难以维护和理解,因为嵌套层级很深。

百赢出品,必属精品 3106

光电系统光轴校准与偏差控制实战指南

光轴作为光电系统的空间基准坐标系,直接影响多光谱传感器的协同工作精度。在包含可见光、红外与激光测距的复合系统中,光轴偏差会导致目标识别误差与打击精度下降。通过机械基准建立、光学通道粗调和多光谱协同校准等工厂级标定流程,结合千米靶标法、星点校准法等野战应急方案,可有效控制光轴偏差。典型应用场景中,温度补偿与振动抑制技术能维持光轴稳定性,如某舰载系统通过500Hz高频视觉伺服实现0.3mrad振动补偿。掌握这些光轴标定与保持策略,对提升光电系统在侦察、测距等场景的实战性能具有关键价值。

weixin_36149538的博客 274

Node.js `async/await` 完全指南:驾驭现代异步编程

本文深入解析 Node.js 中 async/await 的核心机制与实践模式,帮助开发者编写更清晰的异步代码。主要内容包括:1)异步编程从回调到 async/await 的演进过程;2)async 函数始终返回 Promise 的特性及 await 的暂停机制;3)串行/并行执行模式与错误处理方案;4)在 Express 框架中的实战应用;5)ES2022 顶级 await 特性。文章强调结合 Promise.all 实现并行优化,推荐使用 try-catch 进行集中错误处理,并提供了现代 Node.j

2501_93104808的博客 973

【墨者学院 】uWSGI 漏洞复现(CVE-2018-7490)

0x01 漏洞详情 uWSGI是一款Web应用程序服务器,它实现了WSGI、uwsgi和http等协议。 uWSGI 2.0.17之前版本中存在路径遍历漏洞,该漏洞源于程序没有正确的处理DOCUMENT_ROOT检测。攻击者可通过发送带有‘…’序列的特制URL请求利用该漏洞查看系统上的任意文件。 uWSGI 2.0.17之前版本中存在路径遍历漏洞,该漏洞源于程序没有正确的处理DOCUMENT_RO...

Summer's blog 1万+

Node.js 异步编程大师:精通 Promise 与 `async/await`

本文深入解析Node.js中的Promise机制,帮助开发者从回调函数升级到更优雅的异步编程方式。文章首先介绍Promise作为异步操作"契约"的核心理念,详细阐述其三种状态(Pending/Fulfilled/Rejected)的特性。重点讲解Promise链式调用的"水桶流"模型和错误处理的冒泡机制,通过文件处理流水线的实战案例,对比演示了Promise链和async/await两种实现方式。最后,文章还介绍了Promise.all和Promise.allSett

2501_93104808的博客 914

Zemax中场曲与畸变图的深度解析与应用场景对比

本文深度解析了Zemax中场曲/畸变图与网格畸变图的核心原理、计算逻辑与适用场景。通过对比常规成像镜头、扫描镜头、鱼眼镜头及变形宽银幕镜头等实际案例,详细阐述了如何根据系统对称性、视场角及核心需求选择正确的分析工具与畸变评价标准,为光学设计中的畸变诊断与优化提供清晰指导。

sand8的博客 482

从理论到代码:如何用随机矩阵理论(RMT)优化你的微生物共现网络分析?

本文详细介绍了如何利用随机矩阵理论(RMT)优化微生物共现网络分析,解决传统阈值法的主观性和不稳定性问题。通过R语言实现端到端的分析流程,包括矩阵标准化、本征值谱分析和自动阈值确定,显著提升网络构建的准确性和可靠性。该方法特别适用于高通量测序数据,能自动识别噪声与真实信号的边界,为微生物组学研究提供更精确的互作网络分析工具。

weixin_29096377的博客 362

AI编程助手深度定制:AGENTS.md规则文件编写与实战指南

这次我们来看一个对 AI 编程助手进行深度定制的核心技能:AGENTS.md 规则文件。对于使用 Codex、Claude Code、Cursor 或 GitHub Copilot 的开发者来说,仅仅安装一个智能体或技能包是远远不够的。真正决定 AI 助手在你项目中表现如何的,是它背后遵循的那套“行为准则”——也就是 AGENTS.md、CLAUDE.md 或 .cursorrules 这类规则文件。 这些文件不是普通的配置文件,它们本质上是写给 AI 的“岗位说明书”和“编码规范”。一个编写得当的规则文件

weixin_34380948的博客 326

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1314

async await用法及原理总结

1.Async Await 原理(注:await 只能出现在 async 函数中) 当调用一个 async 函数时,会返回一个 Promise 对象 (关键) async 函数中可能会有 await 表达式,await表达式 会使 async 函数暂停执行,直到表达式中的Promise解析完成后继续执行 async 中 await 后面的代码并返回解决结果。 既然返回的是Promise 对象,所以在最外层不能直接获取其返回值,那么肯定可以用原来的方式:then() 链来处理这个 Promise 对象 原

qq_44818085的博客 1万+

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现 Visual Studio 2022 C++】

本文介绍了基于CasADi和IPOPT在Visual Studio 2022 C++环境下实现的欠驱动无人船实时非线性模型预测控制(NMPC)方案。文章详细阐述了NMPC基本原理、欠驱动无人船动力学模型(包含状态变量和控制变量定义),并给出了C++实现的核心代码框架。该方案通过显式引入系统动力学模型和约束条件,在每个采样周期滚动优化控制序列,有效解决了欠驱动无人船的轨迹跟踪与避碰问题。文中还提供了VS2022配置CasADi环境的详细步骤,包括预编译包下载、工程属性设置等关键环节,为工程实现提供了完整的技术

vor234的博客 652

windows下宝塔安装教程

windows下宝塔安装教程 目录宝塔是什么?宝塔安装流程1.下载2.配置3.登录4.安装的环境套件小结 宝塔是什么? 宝塔是管理服务器的免费的软件,宝塔上面可以进行对你的服务器批量进行管理,对于运维人员来说还是必不可少的一个软件,值得使用。 宝塔安装流程 1.下载 链接: https://download.bt.cn/win/panel/BtSoft.zip 下载后安装买最好自定义目录,方便找 2.配置 下载完成后会出现这个页面,对着页面进行配置 点击默认密码复制进来,这里注意一点就是一定要查看

你在看屏幕的同时,屏幕也在注视着你 4423

JS异步中async、await讲解

async函数返回值async函数在抛出返回值时,会根据返回值类型开启不同数目的微任务非thenable非promise不等待thenable(等待1个then的时间)promise(等待2个then的时间)await右值类型区别接非 thenable类型,会立即向微任务队列添加一个微任务then,但不需等待接thenable类型,需要等待一个then的时间之后执行接Promise类型(有确定的返回值),会立即向微任务队列添加一个微任务then,但不需等待参考资料。

上善若泪 5079

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1427

【JavaScript】异步函数(async和await详解)

来源于红宝书,详解异步函数

Jerryqjr的博客 6416

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JS异步函数async和await

用于声明异步函数它以类似同步的方式来写异步方法,语法与声明函数类似: 他的调用与函数相同: 的返回结果是一个对象,如果 的值是除 以外的任何值,都算是成功的,都会调用 方法,所以他的输出结果为: 如果返回的值是 或者错误,都会调用 方法: 或者 结果为: 与 要获取 函数的返回结果,就需要用到 的 或 来获取 获取成功的结果: 结果: 获取失败的结果: 结果: 如果函数调用时注册了回调函数,那么注册的回调函数就会被放到中,主线程会先执行下面的代码,再回来执行函数: 结果: 不注册回调

qq_45707021的博客 2667

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JavaScript中的await

async 函数是使用async关键字声明的函数。async 函数是 AsyncFunction 构造函数的实例,并且其中允许使用 await 关键字。async 和 await 关键字让我们可以用一种更简洁的方式写出基于 Promise 的异步行为,而无需刻意地链式调用 promise。async 函数可能包含 0 个或者多个 await 表达式。await 表达式会暂停整个 async 函数的执行进程并出让其控制权,只有当其等待的基于 promise 的异步操作被兑现或被拒绝之后才会恢复进程。

qq_58511059的博客 7980

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JavaScript学习之async函数

JavaScript中的async函数

weixin_45820190的博客 5898

Async-await原理及规则的简单总结

Async-await原理及规则的简单总结

qq_43641110的博客 2995

JavaScript async / await详解

本文是笔者阅读MDN:async和await:让异步编程更简单和阮一峰老师的博客之后的学习笔记,如有疑问,欢迎讨论 async functions 和 await 关键字是最近添加到JavaScript语言里面的。它们是ECMAScript 2017 JavaScript版的一部分(参见ECMAScript Next support in Mozilla)。简单来说,它们是基于promises的语法糖,使异步代码更易于编写和阅读。通过使用它们,异步代码看起来更像是老式同步代码,因此它们非常值得学习。 如.

Niall_Tonshall的博客 1811

JavaScript异步编程的Async/Await

Async/Await是 JavaScript ES8引入的用于处理异步操作的语法糖,它建立在 Promises 的基础上的。使用async/await,可以以几乎同步的方式编写异步代码,极大地简化了复杂异步逻辑的处理。async关键字用于声明一个异步函数,这样的函数会隐式地返回一个 Promise。await关键字只能在async函数内部使用。

qq_53911056的博客 3712

【JavaScript】async 函数与 await 详解

async函数是 JavaScript 中用来处理异步操作的一种声明方式,它的出现极大地简化了异步代码的编写。通过在函数前加上async关键字,我们可以将这个函数定义为异步函数,并允许在函数内部使用await来暂停函数的执行,等待异步操作完成。async和await为 JavaScript 提供了强大的异步处理能力,使得代码更具可读性和可维护性。在现代 Web 开发中,它们已成为处理异步任务的首选工具。通过合理使用async函数和await。

lph159的博客 2111
上一篇: WebGPU 全面解析:下一代 Web 图形与计算 API 的崛起
下一篇: 深入理解 JavaScript 生成器(Generator)(后含async/await实现原理)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值