快点上车,前端异步编程发车了

前端异步编程的六种实现方式,这些你都知道吗? 我们都知道JS是单线程,单线程就是一个时间内只能执行一个任务。也就是程序运行是同步,下一步的程序必须等到上一步程序运行完再运行。 同步机制会很大程度影响到实际的开发和用户体验,一段js代码如果长时间执行就会卡在原地从而影响后面代码的执行,会导致页面卡死,浏览器响应过慢出现“假死”。 为了解决这一问题就有了异步编程! 一、回调函数 异步编程最基本的方法 优点:简单,易于理解 缺点:不利于维护、代码耦合高、使用不当容易引起内存泄漏 例1:假设有两个函数f1(),f2(),f2()需等待f1()的执行 阅读详情

👨‍💻 博客主页:作者主页
👍 觉得文章不错的朋友可以点点赞和关注
🎁 粉丝福利:学习资料、简历模板统统都有点击领取

什么是异步编程?

异步编程允许我们在执行一个长时间任务的时候,程序不用进行等待就可以继续执行后面的代码,直到任务完成后再以回调函数(callback)的方式回头通知你

这种编程模式避免了程序的阻塞,提高了效率,它适用于那些网络请求或者数据库操作的应用。

实现异步的方式

回调函数,是最简单的实现异步的方式

 console.log('111');
 setTimeout(() => {
     console.log("222");
        }, 2000)
        console.log('333');

虽然,按照html文档的输出规则他是自上而下,但是在中间加了一个定时器,然后浏览器识别到了它,会马上执行,然后执行后面的代码,等到了给定时间,会以回调函数的方式返回。

在JS的设计之初,他一开始就是单线程的编程语言,尽管这里回调函数看上去和主线程一起进行的,但是都运行在一个线程中,况且主线程还运行其他代码。

虽然JS只有一个线程,但是还是有比较不错的优点的。因为所有的操作都在一个线程之中,所以不用去考虑资源竞争的问题,而且在源头就避开了线程之间的频繁切换,从而降低了线程开销

但是它也有一个致命的缺点,如果我们需要进行多个异步操作,我们可能会写出下面的代码

 console.log("111");

        setTimeout(() => {
            console.log("三秒后执行1");
            setTimeout(() => {
                console.log("三秒后执行2");
                setTimeout(() => {
                    console.log("三秒后执行3");
                    setTimeout(() => {
                        console.log("三秒后执行4");
                    }, 3000)
                }, 3000);
            }, 3000);
        }, 3000);

        console.log("333");

如果再有别的回调,这样会更恐怖,一直写下去,换谁都看得心慌。我们管这个叫回调地狱

解决回调地狱

为了解决这个回调地狱,Promise诞生了。

我们在页面中动态的更新数据,也就是AJAX技术,就是使用Promise的API fetch()实现的

我们可以试一试用fetch()获取一个接口的数据

通过运行可知道他返回的是一个Promise对象,但是我们还没有获得我们想要的数据,因为Promise翻译一下就是承诺的意思,所以,他应该会在后来给我们实现我们想要的需求,所以,我在后面加个then,then翻译一下就也是然后的意思

所以就是传入它的then方法并传入一个回调函数,如果在后来这个请求成功之后,然后回调函数会被调起,请求的函数会被作为一个参数传入

fetch("http://jsonplaceholder.typicode.com/posts/1")
.then((response)=> ...)

但是如果这样看来Promise和回调函数就没有区别了。

但是,Promise的优点在于它可以用一种链式结构将多个异步操作串联起来

也就是 比如下面的response.json()方法也会返回一个Promise,然后then之后就是将未来返回的response转换为json格式,

fetch("http://jsonplaceholder.typicode.com/posts/1")
.then((response)=>response.json())

然后我们还可以继续追加我们想要进行的操作,直接then下去,比如下面这样把结果打印出来或者把结果存到某个容器中等

fetch("http://jsonplaceholder.typicode.com/posts/1")
.then((response)=>response.json())
.then((json) => console.log(json))

Promise的链式调用避免了代码层层嵌套,尽管有很长的链式调用,但也只是将代码向下方增长而不是向右。可读性会大大提高。

但是在使用异步操作的时候也会遇到错误,比如各种网络问题以及数据格式不正确等。然后我们可以通过在末尾添加一个catch()来捕获这些错误,如果之前任意一个阶段发生了错误,那么catch会被触发,然后之后的then将不会再执行

这跟同步编程中用到的try/catch块相似,Promise还提供了finally方法,会在Promise链结束后调用,无论是否出现错误,我们都可以在这里做函数清理的工作。毕竟要有首有尾嘛。

async/await

现在来看一下async/await,简单来说就是基于Promise之上的语法糖,可以让异步操作更加简单明了。

具体步骤就是

首先使用async将返回值为Promise对象的函数标记为异步函数,就像是刚刚用到的fetch()就是一个异步函数,在异步函数中可以调用其他异步函数,不过不是使用then,而是用更简单的await,中文意思就是等到,等待,所以await会等待Promise完成之后直接返回最终结果

用了async/await之后就是将函数变成异步函数,可以直接获取到我们想要的结果,所以some已经是服务器返回的响应数据了,然后我们就可以进行响应的操作了

await虽然看上去会暂停函数的执行,但是在等待的过程中同样可以处理其他任务,比如我这里将返回的数据转换为json数据,因为await底层就是基于Promise和事件循环机制实现的,具体操作还有很多自行去尝试。

这样我们就拿到了我们想要的数据了。

但是使用的时候也要留意await的错误用法

比如我这样

async function fn() {

            const some1 = await fetch("http://jsonplaceholder.typicode.com/posts/1")
            const some2 = await fetch("http://jsonplaceholder.typicode.com/posts/2")
            const some3 = await fetch("http://jsonplaceholder.typicode.com/posts/3")
            ...
        }

        fn()

虽然看起来没有什么错误啊,但是这样写会打破这两个fetch()操作的并行,因为我们是等到第一个任务完成再执行第二个任务,然后再执行后面的代码。

所以我们有个小妙招。

就是将所有Promise用Promise.all组合起来,然后再去await,比如我下面的做法

async function fn() {

            const some1 = await fetch("http://jsonplaceholder.typicode.com/posts/1")
            const some2 = await fetch("http://jsonplaceholder.typicode.com/posts/1")
            const some3 = await fetch("http://jsonplaceholder.typicode.com/posts/1")
           	
            const [a,b,c] = await Promise.all([some1,some2,some3])
            
        }

        fn()

这样的做法会让运行程序效率提升很多。

最后,我们不能在全局或者普通函数中直接使用await关键字,await只在异步中有效,如果我们想要在最外层中使用await那么需要先定义一个异步函数,然后再在函数体中使用它

使用async await可以写更清晰更容易的理解异步代码,而且不用再使用底层的Promise对象,包括then(),catch()函数等

如果旧版本浏览器不支持async await语法,可以通过转译器编译成旧版本也兼容的代码

🤞作者小三是刚刚毕业不久全栈工程师,写的技术文章基本上是学习过程中笔记整理而来,大家看了之后如果喜欢可以给小弟点点赞哦。
🎁 粉丝福利:学习资料、简历模板统统都有点击领取

前端异步编程常见的实现方式 异步指进程不需要一直等下去,而继续执行下面的操作。前端异步编程常见的实现方式包括回调函数、Promises、Async/Await,以及使用特定的库或框架(如Fetch API、Axios等)。下面将针对每种方式给出例子。 阅读详情

相关推荐

异步编程简介- promise

异步编程历史前端异步编程经历callback、promise、generate、async/await几个阶段。目前在简单场景使用回调,步骤比较多的场景使用promise和async/await,generate昙花一现,由于其api不易理解并且不易于使用而很少使用。promise目的:异步编程解决回调地狱,让程序开发者编写的异步代码具有更好的可读性。promise规范规定了一种异步编程解决方案的API。规范规定了promise对象的状态和then方法。

Q_QQ_QQ_Q的博客 1027

前端--异步编程

秒懂的前端开发异步操作--Promise与async

qq_45832651的博客 465

八种实现异步编程的方式,你了解几个?

一种好的实现异步编程的方式是使用异步函数(async function)和await语句,它们是JavaScript中的异步编程特性,提供了一种简单易用的方法来处理异步任务。另外,还可以使用Promise对象和Async/Await语法,它们提供了更简洁的代码,同时也可以帮助我们更好地组织和管理异步代码。

黑马程序员官方博客 1368

前端宝典二十一:前端异步编程规范手写Promise、async、await

本文主要探讨前端异步编程的处理方式、处理场景,并且手写Promise的全家桶,介绍async、await方法使用

franktaoge的博客 1353

前端实现异步的方法

实现异步的方法

Senora的博客 3633

javascript之异步操作理解---回调函数,async,await以及promise对象

javascript之异步操作理解---回调函数,async,await以及promise对象概述 概述 写在前面:虽然平时做项目,但是发现自己写的代码还是很烂。最近接触了一个对性能要求比较高的项目,于是重新开始审视自己写的代码是不是达到尽量较小系统性能了。加上前几天学到express框架了解到了回调函数的操作。作为拓展,查了许多资料,再次总结一下javascript的异步操作。 javascript是一门单线程语言,即一次只能完成一个任务,若有多个任务要执行,则必须排队按照队列来执行(前一个任务完成,

qq_44774831的博客 4369

前端异步编程的六种实现方式,这些你都知道吗?收藏这篇就够了

欢迎指正!2025开年,AI技术打得火热,正在改变前端人的职业命运:阿里云核心业务全部接入Agent体系;字节跳动30%前端岗位要求大模型开发能力;腾讯、京东、百度开放招聘技术岗,80%与AI相关……大模型正在重构技术开发范式,传统CRUD开发模式正在被AI原生应用取代!最残忍的是,业务面临转型,领导要求用RAG优化知识库检索,你不会;带AI团队,微调大模型要准备多少数据,你不懂;想转型大模型应用开发工程师等相关岗,没项目实操经验……这不是技术焦虑,而是职业生存危机!

Javachichi的博客 1046

前端解决异步的方法和详细的介绍(看了,不后悔)

前端开发中经常会遇到异步操作。这是因为前端开发通常涉及到与服务器进行数据交互、处理用户输入、执行动画效果等任务,这些任务往往需要花费一定的时间来完成。为了确保用户体验和页面性能,前端开发中采用异步操作是很常见的。回调函数(Callback Functions):简单易用:回调函数是最早的异步处理方法之一,其概念简单易懂,使用方便。广泛支持:几乎所有的 JavaScript 环境都支持回调函数,因此在不同的项目中都可以使用。

weixin_51391923的博客 3967

前端异步编程基础

本文主要介绍回调函数,Promise,aysnc/wait这三种异步机制,顺便说说axios

罗不丢的博客 1422

前端的异步调用流程

Promise 是异步编程的一种解决方案,比传统的解决方案–回调函数和事件--更合理和更强大。所谓Promise ,简单说就是一个容器,里面保存着某个未来才回结束的事件(通常是一个异步操作) 的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。配合关键字await使用,await 表示,等待,任务一执行结束之后,才会执行任务二。这两种情况只要发生,状态就凝固了,不会再变了,这时就称为resolved(已定型)让自己定义的多个任务依次执行,上一个任务如果没有完成,下一个任务就不会开始。

IT枫斗者的博客 954

【转载】JS 异步编程六种方案,2024年最新Web前端中高级面试必知必会

使用async/await,你可以轻松地达成之前使用生成器和co函数所做到的工作,它有如下特点:async/await是基于Promise实现的,它不能用于普通的回调函数。async/await与Promise一样,是非阻塞的。async/await使得异步代码看起来像同步代码,这正是它的魔力所在。一个函数如果加上 async ,那么该函数就会返回一个 PromiseGenerator函数依次调用三个文件那个例子用async/await写法,只需几句话便可实现。

2201_75604580的博客 987

深入解析前端异步编程:从Promise到Async/Await的进化之路

Async/Await不仅是一种语法特性,更代表着JavaScript异步编程范式的进化方向。编写出更符合直觉的异步代码构建更健壮的异常处理体系实现更高性能的并发控制设计更优雅的业务流程随着ECMAScript标准的持续演进,Async/Await必将在未来前端工程化体系中扮演更加重要的角色。只有深入理解其本质,才能在复杂业务场景中游刃有余,真正掌握异步编程的艺术。

Yue 1076

前端JavaScript篇之异步编程的实现方式?

回调函数是传统的异步处理方式,可能导致代码难以维护。 Promise提供了更清晰、结构化的异步处理方式,并支持链式调用。 Async/Await是基于Promise的语法糖,使得异步代码更像同步代码,更易于理解。 Generator是一种特殊的函数,可用于实现暂停和生成值,需要手动管理执行过程。

星辰迷上大海的博客 2937

前端面试专栏-基础篇:3. 前端异步编程全场景解读

前端异步编程解析 摘要:本文从核心概念、演进历程和常见场景三个维度剖析前端异步编程。首先解释了单线程环境下通过执行栈、任务队列和事件循环实现异步的机制,包括宏任务与微任务的优先级差异。其次梳理了异步编程的演进过程:从回调函数及其嵌套问题,到Promise的链式调用,再到Generator函数的暂停恢复特性,最终发展为async/await这一主流方案。最后列举了定时器等典型应用场景,展示了异步操作在现代Web开发中的实际价值。全文揭示了如何通过异步编程提升性能和用户体验,同时保持代码可读性。

爱分享的程序员 1396

一篇文章让你搞懂 Javascript异步编程(最全面最详细)

一篇文章让你搞懂Javascript异步编程 Promise和async/await

xuanfather的博客 4059

前端异步编程六种方案

1、回调函数 优点:简单、容易理解和实现 缺点:就是容易写出回调地狱(各个部分之间高度耦合,使得程序结构混乱、流程难以追踪) ajax(url, () => {}); 2、事件监听 特点:异步任务的执行不取决于代码的顺序,而取决于某个事件是否发生 优点:比较容易理解、可以绑定多个事件,每个事件可以指定多个回调函数,而且可以"去耦合",有利于实现模块化 缺点:将整个程序都要变成事件驱动型,运行流程会变得很不清晰。阅读代码的时候,很难看出主流程 f1.on('done', f2); // 事件f1完

C_fashionCat 1271

SpringAI+大模型对接的新小项目巩固

还有就是对话历史的保存用的是面向接口的思想,写好接口,并在具体类中使用接口利用spring的注解Component会自动注入到容器,在Controller中可以用接口对象直接调用,因为目前接口只写了一个,具体类实现接口也只有一个,所以用接口对象直接就可以调用我们需要实现的具体类中中的方法,这样做的好处可以在后面不用再Controller里大幅度改代码,可以直接修改实现接口的具体类或者增加具体类来使用接口,Controller里的接口对象就不用改。,拿到对应 ID,再根据 ID 去拉原始文本,交给大模型。

Huangxy__的博客 224
上一篇: 分库分表的垂直切分与水平切分看这篇就够了
下一篇: 使用异步编程保证Koa的洋葱模型
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值