掌握JavaScript异步操作:Async/Await详解
本文深入探讨JavaScript中的async
/await
,教你如何高效掌控异步操作,编写更清晰易读的代码。
核心要点:
- JavaScript中的
async
/await
简化了异步操作的处理,使代码看起来像同步执行,但实际上仍然是非阻塞的。 -
async
函数返回一个Promise,await
关键字暂停函数执行,直到Promise解决,从而增强代码的可读性和流程控制。 -
async
函数的错误处理可以使用try
/catch
块或Promise
的catch()
方法高效管理。 - 使用
Promise.all
可以优化并行运行异步命令,允许多个Promise
同时解决,而不是顺序执行。 - 异步迭代器和
for...of
循环允许在循环中正确处理async
函数,确保正确的执行顺序和更好的性能管理。 - ES2022引入的顶层
await
允许在ES模块的顶层使用await
,简化了异步代码的集成,无需额外的包装器。
内容概要:
- 如何创建JavaScript异步函数
-
async
关键字 -
await
关键字 - 声明异步函数的不同方法
-
- JavaScript
await
/async
底层使用Promise- 从Promise切换到
async
/await
- 从Promise切换到
- 异步函数中的错误处理
- 使用函数调用的
catch()
方法
- 使用函数调用的
- 并行运行异步命令
- 同步循环中的异步
await
- 顶层
await
- 自信地编写异步代码
在JavaScript中,一些操作是异步的。这意味着它们产生的结果或值不会立即可用。
考虑以下代码:
function fetchDataFromApi() { // 数据获取逻辑 console.log(data); } fetchDataFromApi(); console.log('数据获取完成');
JavaScript解释器不会等待异步fetchDataFromApi
函数完成,然后才执行下一条语句。因此,它会在记录API返回的实际数据之前记录数据获取完成
。
在许多情况下,这不是预期的行为。幸运的是,我们可以使用async
和await
关键字来使我们的程序等待异步操作完成,然后再继续执行。
此功能在ES2017中引入JavaScript,并受所有现代浏览器支持。
如何创建JavaScript异步函数
让我们仔细看看fetchDataFromApi
函数中的数据获取逻辑。JavaScript中的数据获取是异步操作的一个主要示例。
使用Fetch API,我们可以这样做:
function fetchDataFromApi() { // 数据获取逻辑 console.log(data); } fetchDataFromApi(); console.log('数据获取完成');
这里,我们从JokeAPI获取一个编程笑话。API的响应采用JSON格式,因此在请求完成后(使用json()
方法)我们提取该响应,然后将笑话记录到控制台。
请注意,JokeAPI是一个第三方API,因此我们无法保证返回的笑话质量!
如果我们在浏览器或Node(使用--experimental-fetch
标志的17.5 版本)中运行此代码,我们会看到控制台仍然以错误的顺序记录内容。
让我们改变一下。
async
关键字
我们需要做的第一件事是将包含函数标记为异步函数。我们可以使用async
关键字来实现这一点,我们将它放在function
关键字的前面:
function fetchDataFromApi() { fetch('https://v2.jokeapi.dev/joke/Programming?type=single') .then(res => res.json()) .then(json => console.log(json.joke)); } fetchDataFromApi(); console.log('数据获取完成');
异步函数始终返回一个Promise(稍后详细介绍),因此只需将then()
链接到函数调用即可获得正确的执行顺序:
async function fetchDataFromApi() { fetch('https://v2.jokeapi.dev/joke/Programming?type=single') .then(res => res.json()) .then(json => console.log(json.joke)); }
如果我们现在运行代码,我们会看到类似这样的内容:
fetchDataFromApi() .then(() => { console.log('数据获取完成'); });
但我们不想这样做!JavaScript的Promise语法可能会有点复杂,这就是async
/await
闪光的地方:它使我们能够使用看起来更像同步代码的语法来编写异步代码,并且更易于阅读。
await
关键字
接下来要做的是在函数中任何异步操作的前面加上await
关键字。这将强制JavaScript解释器“暂停”执行并等待结果。我们可以将这些操作的结果分配给变量:
<code>程序员的浪漫:一行代码解决千行代码的bug。 数据获取完成</code>
我们还需要等待调用fetchDataFromApi
函数的结果:
async function fetchDataFromApi() { const res = await fetch('https://v2.jokeapi.dev/joke/Programming?type=single'); const json = await res.json(); console.log(json.joke); }
不幸的是,如果我们现在尝试运行代码,我们会遇到一个错误:
await fetchDataFromApi(); console.log('数据获取完成');
这是因为我们不能在非模块脚本的async
函数之外使用await
。我们稍后将更详细地介绍这一点,但现在解决这个问题最简单的方法是用它自己的函数包装调用代码,我们也将其标记为async
:
<code>Uncaught SyntaxError: await is only valid in async functions, async generators and modules</code>
如果我们现在运行代码,所有内容都应该按正确的顺序输出:
async function fetchDataFromApi() { const res = await fetch('https://v2.jokeapi.dev/joke/Programming?type=single'); const json = await res.json(); console.log(json.joke); } async function init() { await fetchDataFromApi(); console.log('数据获取完成'); } init();
我们需要这个额外的样板代码这一事实是不幸的,但在我看来,代码仍然比基于Promise的版本更容易阅读。
声明异步函数的不同方法
前面的示例使用了两个命名函数声明(function
关键字后跟函数名),但我们并不局限于此。我们还可以将函数表达式、箭头函数和匿名函数标记为async
。
如果您想回顾一下函数声明和函数表达式之间的区别,请查看我们的指南
(后续内容同理,根据原文逐段改写,保持原意,并调整语言风格,使之更流畅自然)
以上是初学者的JavaScript异步指南,等待示例的详细内容。更多信息请关注PHP中文网其他相关文章!

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!