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

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

询问

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

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

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

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

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

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

使用 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 对象。

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

一次良好的询问~                                                    

以上就是ChatGPT助我学习之[js-async/await]的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2695751.html

(0)
上一篇 2025年3月7日 18:24:31
下一篇 2025年3月7日 18:24:41

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 详解js在html中的加载执行顺序

    js在html中的加载执行顺序 1.加载顺序:引入标记的出现顺序, 页面上的js代码是js的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记的出现顺序, 标记里面的或者通过src引入的外部JS,都是按照其语句出现的顺序执…

    编程技术 2025年4月4日
    100
  • HTML和JS实现简单的计算器

    HTML和JS实现计算器功能的也是很容易的,本文主要和大家分享HTML和JS实现简单的计算器,希望能帮助到大家。 下面是代码:    nbsp;html>无标题文档 var result=””; function jisuan(num…

    编程技术 2025年4月4日
    100
  • 实现在HTML页面加载完毕后运行js方法

    本文主要和大家分享实现在HTML页面加载完毕后运行js方法,主要以代码的方法和大家分享,希望能帮助到大家。 Js方法: window.onload=function (){ var userName=”xiaoming”; alert(us…

    编程技术 2025年4月4日
    100
  • JavaScript实现获取远程的html到当前页面中

    今天做个项目,需要在当前的html页面中引用一个远程的html页面,百度了一下,发现一个非常好用的代码,这里分享给大家,有相同需求的小伙伴可以来看看 html代码 登录后复制 立即学习“Java免费学习笔记(深入)”; javascript…

    编程技术 2025年4月4日
    200
  • JavaScript模块优化

    给大家分享一下如何才能开发出更好的javascript模块和功能,有兴趣的朋友参考学习下吧。 不少人都曾经在 npm 上发布过自己开发的 JavaScript 模块,而在使用一些模块的过程中,我经常产生“这个模块很有用,但如果能 xxx 就…

    编程技术 2025年4月4日
    100
  • 适用于JavaScript开发人员的10个必备VSCode扩展

    如今,visual studio code无疑是最流行的轻量级代码编辑器。它确实从其他代码编辑器那借鉴了很多,最主要是从sublime和atom那里。然而它的成功关键是源于能提供更好的性能和稳定的表现。 另外,它还提供了如代码智能提示等开发…

    2025年4月2日 编程技术
    200
  • 提高 JavaScript 开发效率的高级 VSCode 扩展!

    如今,visual studio code无疑是最流行的轻量级代码编辑器。vs code的强大无疑来自于它的插件市场。多亏了开源社区,vs code现在几乎对所有的编程语言、框架和开发技术都有支持。 提供这种支持的方式是多样的,主要包括了为…

    2025年4月2日 编程技术
    200
  • 如何利用Vue实现拖拽穿梭框功能?四种方式介绍

    如何实现拖拽穿梭框功能?下面本篇文章给大家介绍一下vue实现拖拽穿梭框功能四种方式,希望对大家有所帮助。 【相关推荐:vue】 一、使用原生js实现拖拽 vue Lazyload .drag { background-color: skyb…

    2025年4月1日
    100
  • 聊聊MVVM模型在Vue中怎么应用

    理解MVVM模型 我们知道每一个 Vue 应用都是从创建一个新的实例开始的,根据 Vue2 的官方文档我们可以得知 Vue 的设计是得到了 MVVM 模型 的启发,所以就有了在我们创建 Vue 实例时,文档中经常使用vm这个变量名来表示 V…

    2025年4月1日 编程技术
    200
  • 浅析Vue3动态组件怎么进行异常处理

    vue3动态组件怎么进行异常处理?下面本篇文章带大家聊聊vue3 动态组件异常处理的方法,希望对大家有所帮助! 【相关推荐:vuejs视频教程】 动态组件有两种常用场景: 一是动态路由: 立即学习“前端免费学习笔记(深入)”; // 动态路…

    2025年4月1日
    100

发表回复

登录后才能评论