nodejs学习

news/2025/1/11 0:15:38/文章来源:https://www.cnblogs.com/elian/p/18437002

nodejs中的v8引擎模块

一、promise钩子模块;
二、垃圾回收模块;

1、promise钩子包括:
(1)onInit(callback) 在promise创建时调用;
(2)onSettled(callback) 在fulfilled或rejected时调用;
(3)onBefore(callback) 在promise继续执行之前调用的回调;
(4)onAfter(callback) 在promise继续执行之后调用的回调;

const { promiseHooks } = require('v8')// 1、创建一个钩子函数,在Promise对象初始化时输出日志;
const initHook = () => {console.log('Promise 对象被创建')
}
// 注册钩子函数
promiseHooks.onInit(initHook)// 2、定义一个settle钩子函数
const settledHook = () => {console.log('当promise对象被settled(即fulfilled或rejected)时触发;')
}// 注册钩子函数
promiseHooks.onSettled(settledHook)// 3、定义一个before钩子函数
const beforeHook = () => {console.log('Promise 对象 在 promise 继续执行之前调用的回调;')
}promiseHooks.onBefore(beforeHook)// 4、定义一个before钩子函数
const afterHook = () => {console.log('Promise 对象 在 promise 继续执行后调用的回调;')
}promiseHooks.onAfter(afterHook)let promiseObj = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise resolved')}, 2000);
})promiseObj.then((result) => {console.log(result)
})

运行的结果:

2、v8的垃圾回收
垃圾回收包括3种回收算法:
(1)引用计数法:js维护的引用表记录了内存的引用次数,当值为0时,被GC回收,它虽然能在发现垃圾时及时清除,但无法处理循环引用的对象内存;
(2)标记清除法:遍历当前对象是否可以访问,如果不能则添加标记然后清除,它遍历的均为可达对象而不是像循环引用的局部对象,因此可以解决循环引用问题,但其标记和清除是在不同阶段执行的,不能立即清除;
(3)分代算法:堆内存中存在新生代和老生代2种空间,在新生代,新创建的对象都会被分配到from区域,在GC阶段,将from区域中存活的数据复制到2区域,2区域再进行交互,实现一次垃圾回收,如果在两次gc中都还存活的数据就会被晋升到老生代区域存储。

const v8 = require('v8')// 启用GCprofile
v8.setFlagsFromString('--trace_gc');// 模拟创建大量对象并释放内存
const createObject = () => {const object = []for (let i = 0; i < 100000; i++) {object.push({})}
}
createObject()// 等待一段时间,让垃圾回收产生
setTimeout(() => {v8.setFlagsFromString('--notrace_gc')
}, 5000);

运行的结果:

nodejs中EventEmitter
1、EventEmitter实现

// 自己实现一个eventEmitter/*** 1、注册* 2、触发* 3、移除* 4、测试*/class EventEmitter {constructor() {this._event = {}}// 注册on (type, listener) {let events = this._eventlet existing = events[type]if (existing === undefined) {events[type] = [listener]} else {// 事件存在则追加events[type] = [...existing, listener]}return this}// 触发emit (type, ...args) {// 找到当前触发的回调函数const handler = this._event[type]console.log('handler', handler)if (!handler) {console.log(`event ${type} noting existing!`)} else {// 存在当前事件const length = handler.length// 当前事件只有一个if (length === 1) {// 直接触发回调函数handler[0](args)} else if (length > 1) {// 当前事件有多个回调函数// 遍历该事件所有回调函数,依次触发for (let i = 0; i < length; i++) {handler[i](args)}} else {return this}}}// 移除监听off (type, listener) {let list = this._event[type]if (!list) {// 事件不存在console.log(`event ${type} is not existing!`)} else {let length = list.lengthlet postionif (length === 1) {delete this._event[type]} else {// 要删除的事件存在多个监听// 找出要删除的事件的下标for (let i = 0; i < length; i++) {if (list[i] + '' === listener + '') {postion = ibreak} else {postion = -1}}if (postion != -1) {delete this._event[type].splice(postion, 1)} else {this._event[type].pop()}}}}
}let emitter = new EventEmitter()
emitter.on('data', (data) => {console.log('第一个订阅data事件的对象:', data)
})let handler = (data) => {console.log('第二个订阅data事件的对象', data)
}
emitter.on('data', handler)emitter.on('data', (data) => {console.log('第三个订阅data事件的对象', data)
})emitter.off('data', handler)
emitter.emit('data', 'hello world')

运行结果

node事件循环
尽管js是单线程的,但是可以通过将异步操作转移到系统内核去完成从而实现非阻塞的机制称为事件循环。
因为现代内核都是多线程的,它们可以在后台执行多个操作,当某个操作完成时,内核通知Node.js,将对应的回调添加到轮询队列中。

事件循环的六个阶段:
1、timer阶段,执行setTimeout()和setInterval()
2、Pending和callbacks阶段:执行推迟到下一个循环迭代的I/O回调。
3、idle、prepare阶段,内部使用
4、poll阶段:执行I/O操作
5、check阶段:执行setImmediate()
6、close callbacks阶段:关闭回调
在每次运行事件循环时,Node.js都会检查它是否在等待任何异步I/O或定时器,如果没有,则会关闭。

使用process.nextTick的原因:
1、允许用户处理错误,清除任何不需要的资源,或者在事件循环继续之前重试请求
2、允许回调在同步之后,但在事件循环之前运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/805954.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【牛客训练记录】牛客周赛 Round 62

https://ac.nowcoder.com/acm/contest/91177#question赛后反思 一直都不会做期望,对于概率论相关的需要加强 A题 直接模拟字符串字符交换即可 #include <bits/stdc++.h> #define int long longusing namespace std;void solve(){string s; cin>>s;cout<<s[1…

Large_bins_attack

导言 在libc版本越来越高的情况下,许多旧的攻击方式已然失效,而large_bin_attack始终屹立不倒,是许多攻击方式的先决条件,这也是我们要学习它的原因 large_bin 概念 large_bin是一种堆分配的管理方式,是双向链表,用于管理大于某个特定大小阈值的内存块。一般而言,进入la…

直播的剪辑工作流/工具分享

基本流程获取素材 粗剪 导出音频识别成字幕文件 应用字幕并校准字幕 配bgm并进行精剪工具分享 一 获取直播素材高时效性-即录即拿:VLC media player、录屏软件(如Screen Record Pro等) 中时效性但解放双手-需要等待其录制/编码完成:biliup:如果想保持想保存为mp4,需要安装f…

AT_arc184_d [ARC184D] Erase Balls 2D

AT_arc184_d [ARC184D] Erase Balls 2D 首先,假定我们选定的行为 \(i_1,i_2,\cdots,i_k\),并有 \(i_1<i_2<\cdots<i_k\),则 \(p_{i_1}>p_{i_2}>\cdots>p_{i_k}\)。其中 \(p_x\) 表示 \((x,p_x)\) 的位置上有点。 最终状态形如下图。显然,这种状态与操作顺…

「Wdoi-(-1)」恋弹者们的黑集市

「Wdoi-(-1)」恋弹者们的黑集市 魔理沙有两种方法移动这个骰子:将骰子向下一列翻转,或者向下一行翻转。值得注意的是,翻转骰子后,骰子每面上的数字就会随着翻滚而改变。现在魔理沙需要将骰子滚动至第 \(n\) 行第 \(m\) 列。 魔理沙的分数被定义为,所有时刻,骰子与棋盘上的…

腾讯企业邮箱(企业微信邮箱)迁移到microsoft 365(office 365)

1.迁移前准备(腾讯企业邮箱)1.如果你是企业管理员,首先看一下企业邮箱后台,是否已关闭 登陆安全2.登录要迁移的个人邮箱后台,关闭安全登录、开启IMAP服务和相关选项,以及为邮箱设置一个密码 2.开始迁移1.登录microsoft 365管理后台(https://admin.exchange.microsoft.com…

腾讯企业邮箱迁移到microsoft 365(office 365)

1.迁移前准备(腾讯企业邮箱)1.如果你是企业管理员,首先看一下企业邮箱后台,是否已关闭 登陆安全2.登录要迁移的个人邮箱后台,关闭安全登录、开启IMAP服务和相关选项,以及为邮箱设置一个密码 2.开始迁移1.登录microsoft 365管理后台(https://admin.exchange.microsoft.com…

micropython +ESP32+ sht30 温湿度模块

SHT30 1)查找SHT30芯片资料 https://www.szlcsc.com 2)根据芯片资料,查得地址为 0x44 或 0x45 选 Measurement Commands for Single Shot Data Acquisition Mode, 命令为 0x2c10 3)连线SHT30 ESP32 D1(SCL) 4D2(SDA) 5 G …

系统固态扩容-全小白操作示意 不需要BIOS

机械革命有两个插槽,我有一个500G(系统盘)一个1T的固态,由于1.5T的固态都快用完了,所以买了一个2T的固态,将1T的内容迁移到2T中,将500G的迁移到1T中。 为了防止内容丢失先将500G系统盘做了备份,用的傲梅轻松备份。 1T->2T 然后就是将2T的固态用绿联的固态盒子先当做移…

2024-2025-1 20241318 《计算机基础与程序设计》第一周学习总结

这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 阅读浏览教材《计算机科学概论》并提出自己的问题,基于AI进行学习作业正文 ... 本博…

学年(2024-2025-1) 学号(20241424)《计算机基础与程序设计》第一周学习总结

学年(2024-2025) 学号(20241424)《计算机基础与程序设计》第一周学习总结 作业信息 |这个作业属于2024-2025-1-计算机基础与程序设计)| |-- |-- | |这个作业要求在2024-2025-1计算机基础与程序设计第一周作业)| |这个作业的目标|<参考上面的学习总结模板,把学习过程通…

Qt - 文件操作3

8. QSettings8.1 简介 用户通常希望应用程序在会话中记住它的设置(窗口大小和位置,选项等)。 这些信息通常存储在Windows上的系统注册表中(HKEY_CURRENT_USERSoftware/MySoft ),以及macOS和iOS上的属性列表文件中。 在Unix系统上,在缺乏标准的情况下,许多应用程序(包括KDE应…