0

0

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

藏色散人

藏色散人

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

|

1346人浏览过

|

来源于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 对象。

DeepAI
DeepAI

为天生具有创造力的人提供的AI工具

下载

总的来说,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 风格的代码模型的补充,以实现更加灵活和高效的异步编程。


一次良好的询问~                                                    

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

547

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

373

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

730

2023.07.04

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

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

472

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

655

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

550

2023.09.20

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.08

热门下载

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

精品课程

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

共58课时 | 3.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.8万人学习

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

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