问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Node.事件循环--理解同步和异步编程

发布网友 发布时间:2024-09-06 17:20

我来回答

1个回答

热心网友 时间:2024-09-14 21:36

【前言】Node.js是一个异步事件驱动的JavaScript的运行环境,旨在建立可以扩展的网络应用,所谓异步事件是指JavaScript中的所有那些在后台处理的(例如Ajax请求)、而且不会阻塞任何其他请求的功能。这篇文章将帮助你学习并理解Node.js是如何工作的,如何处理发送到服务器的功能和请求,无论是同步还是异步。

什么是事件循环机制

JavaScript被设计为单线程语言,也就是说每次只能执行一项任务,其他任务都得按照顺序排队等待被执行,只有当前的任务执行完成之后才会执行下一个任务。任务分为同步任务和异步任务,异步任务永远在同步任务执行完后才执行,而事件循环是一个事件*(event-listener),他在Node环境中发挥作用,并随时准备监听、处理和输出一个事件(event),而这个事件可以是任何东西。

什么是同步和异步同步编程

同步编程(Synchronousprogramming)意味着代码按其定义的顺序运行。在一个同步程序中,当一个函数被调用并返回了一些值后,才会执行下一行。

代码举例

const?listItems?=?function(items)?{????items.forEach(function(item)?{????????console.log(item)????})};const?items?=?["Buy?milk",?"Buy?coffee"]listItems(items);

输出结果

Buymilk

Buycoffee

在上述代码中,当listItems(items)函数被调用时,它将循环浏览数组中的项目。console.log(item)函数首先对数组的第一个项目被调用,并打印出"Buymilk",然后console.log(item)再次被执行,这次它通过数组的第二项,并打印出"Buycoffee",所以说这个函数是按照它被定义的顺序执行的,也称为同步执行。

异步编程

异步编程(Asynchronousprogramming)是指不按顺序执行的代码。这些函数不是按照它们在程序中定义的顺序执行,而是只有在满足某些条件时才执行。

例如:setTimeOut()在延迟一定时间的毫秒后执行一项任务。代码举例

setTimeout(()?=>?{????console.log('我是一个异步任务');},?4000)const?listItems?=?function(items)?{????items.forEach(function(item)?{????????console.log(item)????})}const?items?=?["Buy?milk",?"Buy?coffee"]listItems(items);

输出结果

Buymilk

Buycoffee

我是一个异步任务

在上述代码中,代码的执行顺序依旧从上到下,执行到setTimeout()函数时,发现是一个异步任务,并不会立即执行,而是继续向下执行同步代码,打印出Buymilk和Buycoffee,等待所有的同步任务都执行结束之后,返回执行setTimeout()函数,等待4秒后执行完毕打印出我是一个异步任务。

处理异步任务流程图

宏任务和微任务宏任务

宏任务(macro)task,可以理解是每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行);

宏任务举例:

任务(代码)宏任务环境script宏任务浏览器事件宏任务浏览器网络请求(Ajax)宏任务浏览器setTimeout()定时器宏任务浏览器/Nodefs.readFile()读取文件宏任务Node微任务

微任务(microtask)是宏任务中的一个部分,它的执行时机是在同步代码执行之后,下一个宏任务执行之前。

微任务包含:

Promise.then;

process.nextTick(Node.js环境)。

运行机制

在事件循环中,每进行一次循环操作称为tick,每一次tick的任务处理模型是比较复杂的,但关键步骤如下:

执行一个宏任务(执行栈中没有就从事件队列中获取);

执行过程中如果遇到微任务,就将它添加到微任务的任务队列中;

宏任务里的同步代码执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行);

当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染;

渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)。

【往期分享】

ES6中的Promise

Node.js安装使用

原文:https://juejin.cn/post/7097119422585765901

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...经常感到孤独、万事无聊,请问怎样治疗孤独?谢谢! 移动号码不用了一段时间现在拨号显示空号要怎么激活 圣女小番茄简介 《一曲终人两散》最新txt全集下载 石膏几何体写生内容简介 石膏几何体内容简介 句子: We mustn't climb the trees.怎么填空? 市妇婴医院生产点样建档? 长治怀孕建档要准备什么材料呢? 工厂隔音房 nodeid是什么意思? nodejs的作用? 区块链里nobe是什么,区块链里nobe是什么意思 如何让挂钩上的吸盘能不掉 怎样护理皮草外套不容易氧化? 怎样预防皮草氧化? 电焊工职业资格证书现在取消了吗,哪位知道,请告诉我 一千平方米舞厅三楼只有一个楼梯口安全吗? 比亚迪秦plusdmi尊贵型如何验车 布偶猫如何判定满背 有什么标准 与朋友合资开店,却无出资证明,怎么办? 我想和别人合资开个小火锅店,为了避免以后的经济纠纷,应该办理哪些法律... ...走一些什么样的程序。然后合同应该怎么样签定? 法律规定合资开店的合同怎么写? 从福田汽车站到罗湖关口怎么走 农场建造类游戏大全 救生照明线为什么不能采用耐高压线 商场里的电缆线需要高压线吗 粤语(甲字难写)"甲"字究竟是哪个? ...那有甲字写什么意!宋之写意甲请问宋某人,他的写意甲什么意思... namenode主服务器的作用是什么 华为手表怎么添加应用市场呢? 大三学生该如何备考考研? 如果大三考研的话需要做什么准备 《我的世界》这款游戏好不好玩呢? 会计上所说的 "财务年度和会计年度"有什么区别 什么是年度财务报告 新疆买什么 为什么苹果手机拍视频很清楚,传到网上就不清晰了? 苹果5s拍视频明明很清晰,为什么上传空间就很模糊了,系统没更新前没有... 小米多看电纸书怎么样?使用测评 全国十大灯具城 为什么我的电脑与电视的vgr端口连接后,虽然可以显示出视屏来,但是再次... 如何评价等等党和够用党? 欧米茄omega220.12.40.20.01.001手表档次如何、怎么样? 挂靠户口对户主有影响吗 户口挂靠非直系亲属拆迁享受 同一户口本上的非直系亲属房产申请相互之间影响吗 uniapp和hbuilder的关系? 公司用vue还用原生吗(大公司很少用vue)