千家信息网

Node.js中怎么实现异步编程

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,Node.js中怎么实现异步编程,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。其实对大部分的开发者来说,异步编程与一般自
千家信息网最后更新 2025年12月02日Node.js中怎么实现异步编程

Node.js中怎么实现异步编程,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

其实对大部分的开发者来说,异步编程与一般自然语言的线性思维会有所冲突。所以大部分开发者不能适应直接面向事件驱动进行编程,Node.js是首个将异步编程带到应用层面的平台,Node.js无时无刻不透露出异步的信息。

在接触Node的过程中,很多人只是很粗略的接触了几个回调函数之后就放弃了,确实Node使用异步编程,容易陷入回调地狱,但是Node异步编程的难题其实已经基本解决,可以通过事件发布/订阅模式,或者通过Promise/Defferred模式,其实都可以完美的去解决回调陷阱的问题。

其实大部分开发人员都习惯线性思维去思考问题,所以同步编程一直很流行。但是单线程同步模型中,CPUI/O操作无法重叠进行,所以性能问题也就摆在了开发人员的面前。在大多数语言中,提高性能的方式一般使用多线程的方式解决,但是多线程中线程切换耗费的开销,以及锁以及线程同步等问题,所以多线程会给开发人员业务逻辑带来麻烦。而Node直接采用异步编程,可以使CPUI/O操作并行不用相互等待,可以让资源等到更好的利用。

异步IO与非阻塞IO的区别

非阻塞IO是由于完整的I/O没有完成,立即返回的并不是我们执行的最终数据,而仅仅是返回当前的调用状态,为了获得完整数据需要进行轮询重复调用I/O操作确认是否完成。异步I/O可实现不等待数据读取完成,执行I/O操作后后立刻返回,数据写入缓存,由底层完成监听操作,并返回成功或失败的信息给应用。

异步编程优点

Node.js最大的优点莫过于基于事件驱动的非阻塞I/O模型,非阻塞I/O可以使CPUI/O操作不用相互等待,可以让资源可以得到更好的利用。Node.js为了解决编程模型中阻塞I/O的性能问题,采用单线程异步模型,所以Node.js更适合I/O密集型问题,因为Node.js面向驱动进行编程,所以需要面对海量请求,当海量请求同时作用在单线程上时,就需要防止任何一个会过度消耗时间片的请求。所以只要合理利用Node.js的异步模型,加上V8引擎的高性能,就可以充分发挥CPUI/O并行的优势。

异步编程的难点

Node.js借助异步I/O模型以及V8引擎,突破了单线程的性能瓶颈,让JavaScript在后端体现了实用价值。但是也由于异步编程会给开发者带来一些难点。

(1)函数嵌套过深

在前端JavScript,DOM事件绑定一般较少存在多重事件绑定的情况。一般为不同的DOM元素绑定不同的事件。

但是对于Node.js而言,多个异步调用的场景比比皆是。

其实对于最后的结果来说这样的函数嵌套结构是没有任何问题的,但是这样并没有利用好Node.js异步I/O带来的并行优势。而且函数嵌套过深,对于开发人员的后期维护也会造成困难。

(2)阻塞代码

JavaScript并没有类似Javasleep()这样的线程沉睡功能,可以进行延时操作的只有setInterval()setTimeout()这两个函数。那么如果我们需要在JavaScript中实现延迟1s要怎么做呢?其实大部分开发者可能会这么去进行实现:

但是请记住Node.js是单线程模型,所以在执行的时候CPU资源会全部为了这段代码进行服务。从而导致其他请求全部被视而不见。所以我们可以采用setTimeout改写一下代码效果会更好:

但是这里有一个问题,如果我把后面的时间设成0,是不是意味着马上执行代码呢?这个问题大家可以思考一下,对答案感兴趣的可以直接在公众号发消息,我会及时回复。

(3)多线程编程

因为Node.js是单线程模型,对于多核CPU服务端而言,其实Node.js单进程是没有充分利用好多核CPU的,所以浏览器可以将JavaScriptUI渲染分离,就可以更好的去利用多核CPU为大量计算做服务。但是这种开发模式开发者要面临跨线程的编程,对于JavaScript一直走的单线程编程路线来说会增加一定的难度。

(4)异常处理

我们在使用Java进行异常处理其实是非常方便的,可以直接通过try/catch/finally语句进行异常捕获以及异常处理。

但是在异步编程中这种常用的异常处理并不一定适用,因为前面有讲过异步编程时异步I/O提交请求后马上返回,因为异常一般不会发生在此阶段,这时候你对这段代码执行try/catch操作进行异常捕获其实不会发挥作用,因为try/catch只能捕获当次事件内发生的异常,对事件执行结束返回的回调函数callback中抛出的异常其实是无能为力的,所以在Node.js中,将异常作为回调函数callback的第一个参数传回,如果为空时,则表示回调函数没有抛出任何异常。

上述代码中,执行checkLogin如果出现异常,则回调函数的第一个参数err则不为空,我们就可以根据这个err参数对异常进行处理。

异步编程解决方案

(1)事件发布/订阅模式

(2)Promise/Deferred模式

(3)流程控制库

由于这三种方案涉及知识点较杂,这篇文章暂时不对这三种方案作具体介绍,下一篇文章会对这三种方案作具体介绍。

异步并发控制

Node.js中,我们可以很轻易的利用异步发起并行调用,但是如果并发量过大,我们的服务器会承受不住,比如如果是对文件系统进行大量并发调用,操作系统的文件描述符数量会在瞬间被用光。所以对于异步编程来说并发很容易实现,但是也要有一定的过载保护。这里主要讲一种过载解决方案:async.

async提供了一个方法parallelLimit()用于处理异步调用的限制。

parallelLimit()方法有一个用于限制并发数量的参数,使得任务只能同时并发一定数量,而不能无限量同时并发。上面的代码,我们并发数设置为1,所以只能同时并发一个任务。

但是parallelLimit()有一个缺点:无法动态的添加并行任务。但是async提供了queue()方法可以动态添加并行任务,这对于遍历文件目录等操作是非常高效的。但是queue()接收的参数是固定的,丢失了parallelLimit()的多样性。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

编程 线程 开发 事件 函数 问题 模型 代码 处理 阻塞 参数 开发者 方案 模式 人员 任务 同时 性能 数据 服务 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 jar主动检测数据库 关于网络技术与应用的论文 网络安全图片艺术字 荷兰发包服务器渠道 四川鲲鹏系列服务器 db2数据库在线备份工具 银行数据服务器一般在哪里 深圳口碑好的网络技术代理价钱 网信办网络安全讲座心得 校园网络安全问题的总结 华为软件开发文档的重要性 美国洛杉矶服务器 上海客户管理软件开发 计算机网络技术专业赚钱吗 有情人终成眷属伴奏软件开发 网络安全活动周活动方案 医学类计算机网络技术专升本 我的世界如何建造一个服务器主城 永康市学途网络技术有限公司 网络安全期刊审稿速度 国家对网络安全教育日的规定 家长群网络安全 小程序定制软件开发广告语 北京网络安全工资待遇 华为网络技术命令 数字媒体技术和网络安全 北京世纪联合网络技术 c 客户端如何向服务器提取数据 三级网络技术入股 服务器远程管理在哪里
0