讲师中心 微信公众号
AI工具推荐 视频效率加速

ChatGPT助我学习之[js-async/await]

胖明大大_6315

胖明大大_6315

发布时间:2023-04-14 14:47:20

|

1446人浏览过

|

来源于learnku

转载

本次提问涉及了询问用法,追问疑惑,确认掌握~

询问

js sync await  给我讲一下,还是有些迷惑

在 JavaScript 中,我们经常需要处理异步任务,例如从服务器获取数据、向服务器发送数据等。传统的方式是使用回调函数来处理异步任务,这在多层嵌套时会导致回调地狱,代码难以维护和调试。为了解决这个问题,JavaScript 引入了 Promise 和 async/await 两种方式来处理异步任务。

其中,async/await 是 ES8 中新增的语法糖,可以更简单、直观地处理异步任务。关于 async/await 你可以从以下几点来理解:

  1. async 函数是一个返回 Promise 对象的异步函数,可以使用 await 关键字等待异步操作的结果,在等待的过程中 async 函数会释放 CPU,让其他任务可以执行。

  2. await 关键字只能在 async 函数中使用,可以等待一个 Promise 对象的结果,如果 Promise 对象变为 resolved 状态,则 await 表达式的值为 Promise 返回的结果;如果 Promise 对象变为 rejected 状态,则会抛出错误并被 try-catch 块捕获。

  3. async 函数内部可以有多个 await 表达式,它们之间是顺序执行的,后面的 await 表达式需要等待前面的 await 表达式完成后再执行。

  4. 使用 async/await 可以将异步代码写成类似同步代码的形式,代码更加易读易懂,也更容易调试和维护。

下面是一个使用 async/await 处理异步任务的示例:

async function getData() {
  try {
    const result1 = await fetch('/api/data1'); // 等待获取数据1
    const result2 = await fetch('/api/data2'); // 等待获取数据2
    return [result1, result2]; // 返回获取的数据
  } catch (error) {
    console.error(error); // 捕获错误并输出到控制台
  }
}

getData().then(data => {
  console.log(data); // 输出获取的数据
});

在上面的例子中,getData 函数使用 async 关键字声明,并在函数内部使用 await 关键字等待异步操作的结果,这里使用了两个 await 表达式分别获取不同的数据。在本示例中,最终返回两个异步操作的结果数组,如果发生异常,将会被 try-catch 块捕获并输出错误信息。最后,我们通过调用 getData() 方法来获取异步数据,并且在返回结果后输出数据到控制台。

提出疑惑

我感觉到很迷惑 await 是为了等待 对应的异步函数,那么为什么要在使用 await的函数上加 async呢

非常好的问题!答案是:因为 await 关键字只能在 async 函数中使用。

使用异步函数获取异步任务的结果时,我们需要将其放置在一个 async 函数内部,然后使用 await 等待异步操作的结果。因此,若想使用 await 关键字,必须将该函数声明为 async 函数。反之,如果没有使用 async 函数,就不能在该函数中使用 await。

换句话说,只有当一个函数被声明为 async 函数时,该函数才能够包含 await 关键字,这也是 async/await 语法的基本前提。声明函数为 async 是告诉 JS 引擎该函数执行可能会返回 Promise,从而让 JS 引擎在执行该函数时进行特殊的处理。

需要注意的是,使用 await 来等待异步任务的结果并不一定要在函数内部立即返回 Promise 对象,因为 await 关键字的执行过程与 Promise 链式调用的执行过程类似,也会自动创建并返回 Promise 对象。

javascript-pro
javascript-pro

专注现代 ECMAScript、异步编程、性能优化和全栈的 JavaScript 专家,适用于现代开发

下载

总的来说,async 和 await 是构成 Promise 异步编程风格的语法糖,它们让异步代码更加直观和易读,使得我们可以使用同步风格的代码书写和处理异步操作的代码。

确认了解

哦哦实际上 async 这个标记并没有对function进行改造对吧。我原来的时候认为这个标记会把一个函数变成异步函数执行

你说得很对!事实上,async 关键字并不会直接将一个函数变成异步函数执行。它只是告诉 JavaScript 引擎,该函数内部可能有异步操作,并且在使用 await 关键字时可能需要暂停函数的执行。

换句话说,async 关键字并没有改造该函数的本质,而是提供了一种更方便的方式来处理异步操作。当 async 函数被调用时,它会返回一个 Promise 对象,并且 async 函数内部的代码在运行时会自动封装为 Promise 对象的 resolve 方法。当在 async 函数内部使用 await 关键字等待异步操作完成后,该函数将会暂停执行,直到异步操作返回结果或抛出错误。

另外,需要注意的是,在 async 函数内部使用 return 语句返回值时,返回的值会被 Promise.resolve() 包装成一个 Promise 对象,并且该 Promise 对象的值就是 return 语句返回的值。如果 async 函数内部抛出异常,则会被 Promise.reject() 包装成 Promise 对象,并返回给调用者。

因此,我们可以将 async/await 与 Promise 风格的代码结合使用,以创建更简单、直观的异步编程模型。

进一步确认知识点

所以 async 是处理异步操作的表示,而不是创造异步操作的语法

没错,你的理解非常准确。async 是一种处理异步操作的表示,而不是创造异步操作的语法。

实际上,JavaScript 已经拥有了一些用于处理异步操作的机制,如 setTimeout、XMLHttpRequest 和 fetch 等。这些机制都是基于事件循环 (event loop) 的异步编程模型,并且被广泛应用于各种 JavaScript 应用中。

然而,这些机制存在一些问题,如回调地狱和代码可读性差等。为了解决这些问题,Promise 和 async/await 作为一种新的异步编程方式被引入,并较快地得到了广泛的应用。

在这个过程中,async 函数则扮演了处理异步操作的重要角色。它提供了更加直观、易于理解的代码形式,并使得 JavaScript 开发者能够更好地掌握异步编程技术。因此,我们可以将 async 函数看作是 Promise 风格的代码模型的补充,以实现更加灵活和高效的异步编程。


一次良好的询问~                                                    

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4516

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1375

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

10063

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

980

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2804

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

1589

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

4829

2023.09.21

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn