搜索
首页web前端js教程初学者的JavaScript异步指南,等待示例

A Beginner's Guide to JavaScript async/await, with Examples

掌握JavaScript异步操作:Async/Await详解

本文深入探讨JavaScript中的async/await,教你如何高效掌控异步操作,编写更清晰易读的代码。

核心要点:

  • JavaScript中的async/await简化了异步操作的处理,使代码看起来像同步执行,但实际上仍然是非阻塞的。
  • async函数返回一个Promise,await关键字暂停函数执行,直到Promise解决,从而增强代码的可读性和流程控制。
  • async函数的错误处理可以使用try/catch块或Promisecatch()方法高效管理。
  • 使用Promise.all可以优化并行运行异步命令,允许多个Promise同时解决,而不是顺序执行。
  • 异步迭代器和for...of循环允许在循环中正确处理async函数,确保正确的执行顺序和更好的性能管理。
  • ES2022引入的顶层await允许在ES模块的顶层使用await,简化了异步代码的集成,无需额外的包装器。

内容概要:

  1. 如何创建JavaScript异步函数
    • async关键字
    • await关键字
    • 声明异步函数的不同方法
  2. JavaScript await/async底层使用Promise
    • 从Promise切换到async/await
  3. 异步函数中的错误处理
    • 使用函数调用的catch()方法
  4. 并行运行异步命令
  5. 同步循环中的异步await
  6. 顶层await
  7. 自信地编写异步代码

在JavaScript中,一些操作是异步的。这意味着它们产生的结果或值不会立即可用。

考虑以下代码:

function fetchDataFromApi() {
  // 数据获取逻辑
  console.log(data);
}

fetchDataFromApi();
console.log('数据获取完成');

JavaScript解释器不会等待异步fetchDataFromApi函数完成,然后才执行下一条语句。因此,它会在记录API返回的实际数据之前记录数据获取完成

在许多情况下,这不是预期的行为。幸运的是,我们可以使用asyncawait关键字来使我们的程序等待异步操作完成,然后再继续执行。

此功能在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中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
C和JavaScript:连接解释C和JavaScript:连接解释Apr 23, 2025 am 12:07 AM

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

从网站到应用程序:JavaScript的不同应用从网站到应用程序:JavaScript的不同应用Apr 22, 2025 am 12:02 AM

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

Python vs. JavaScript:比较用例和应用程序Python vs. JavaScript:比较用例和应用程序Apr 21, 2025 am 12:01 AM

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

C/C在JavaScript口译员和编译器中的作用C/C在JavaScript口译员和编译器中的作用Apr 20, 2025 am 12:01 AM

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

JavaScript在行动中:现实世界中的示例和项目JavaScript在行动中:现实世界中的示例和项目Apr 19, 2025 am 12:13 AM

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

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

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

了解JavaScript引擎:实施详细信息了解JavaScript引擎:实施详细信息Apr 17, 2025 am 12:05 AM

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

Python vs. JavaScript:学习曲线和易用性Python vs. JavaScript:学习曲线和易用性Apr 16, 2025 am 12:12 AM

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

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 英文版

SublimeText3 英文版

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