方法来引发新的事件,还有一个on()
方法来附加处理器 。
事件示例项目提供了一个类,该类可以在预定的时间间隔内触发一个tick
事件 。./lib/ticker.js
模块导出一个default class
,并extends EventEmitter
:
// emits a 'tick' event every intervalimport EventEmitter from 'events';import { setInterval, clearInterval } from 'timers';export default class extends EventEmitter {
其constructor
必须调用父构造函数 。然后传递delay
参数到start()
方法:
constructor(delay) {super();this.start(delay);}
start()
方法检查delay
是否有效,如有必要会重置当前的计时器,并设置新的delay
属性:
start(delay) {if (!delay || delay == this.delay) return;if (this.interval) {clearInterval(this.interval);}this.delay = delay;
然后它启动一个新的间隔计时器,运行事件名称为"tick"
的emit()
方法 。该事件的订阅者会收到一个包含延迟值和Node.js应用程序启动后秒数的对象:
// start timerthis.interval = setInterval(() => {// raise eventthis.emit('tick', {delay:this.delay,time:performance.now()});}, this.delay);}}
主event.js
入口脚本导入了该模块,并设置了一秒钟的delay
时段(1000毫秒) 。
// create a tickerimport Ticker from './lib/ticker.js';// trigger a new event every secondconst ticker = new Ticker(1000);
它附加了每次tick
事件发生时触发的处理函数:
// add handlerticker.on('tick', e => {console.log('handler 1 tick!', e);});// add handlerticker.on('tick', e => {console.log('handler 2 tick!', e);});
第三个处理器仅使用once()
方法对第一个tick
事件进行触发:
// add handlerticker.once('tick', e => {console.log('handler 3 tick!', e);});
最后,输出当前监听器的数量:
// show number of listenersconsole.log(`listeners: ${ // show number of listenersconsole.log(`listeners: ${ ticker.listenerCount('tick') }`);
使用node event.js
运行代码 。
输出显示处理器3触发了一次,而处理器1和2在每个tick
上运行,直到应用程序被终止 。
Streams上面的文件系统示例代码在输出最小化的结果之前将整个文件读入内存 。如果文件大于可用的RAM怎么办?Node.js应用程序将以"内存不足(out of memory)"错误失败 。
解决方案是流 。这将在更小、更容易管理的块中处理传入的数据 。流可以做到:
- 可读:从文件、HTTP请求、TCP套接字、标准输入等读取 。
- 可写:写入到文件、HTTP响应、TCP套接字、标准输出等 。
- 双工:既可读又可写的流 。
- 转换:转换数据的双工流 。
该示例代码有一个filestream项目,它使用一个转换流来解决
filecompress
项目中的文件大小问题 。和以前一样,它在声明一个继承Transform
的Compress
类之前,接受并验证了输入和输出的文件名:import { createReadStream, createWriteStream } from 'fs';import { Transform } from 'stream';// compression Transformclass Compress extends Transform {constructor(opts) {super(opts);this.chunks = 0;this.lengthOrig = 0;this.lengthNew = 0;}_transform(chunk, encoding, callback) {constdata = https://www.huyubaike.com/biancheng/chunk.toString(),// buffer to stringcontent = data.replace(/n/s+/g,'\n')// trim leading spaces.replace(/\/\/.*?\n/g, '')// remove // comments.replace(/\s+/g, ' ')// remove whitespace.replace(/\/\*.*?\*\//g, '')// remove /* comments */.replace(/<!--.*?-->/g, '')// remove <!-- comments -->.replace(/\s*([<>(){}}[\]])\s*/g, '$1') // remove bracket spaces.trim();this.chunks++;this.lengthOrig += data.length;this.lengthNew += content.length;this.push( content );callback();}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 飞机上可以带辣椒酱吗
- 经济价值高的树种有哪些 世界十大经济树木排名榜
- 可乐鸡翅没有料酒可以用什么代替
- 芒果皮有毒吗
- 原神没有课题的答案任务是什么
- 冰箱里一定有李斯特菌吗
- 学蛋糕甜点适合在哪里学
- 3.5l的砂锅有多大
- 冻干免煮银耳羹还有营养吗?
- 红葱头的吃法