Nodejs - EventEmitter,Buffer
Posted allenj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs - EventEmitter,Buffer相关的知识,希望对你有一定的参考价值。
前面一片我们提到了EventEmitter,并且知道EventEmitter从events中导入和一些简单例子。
EventEmitter
这里我们继续学习一些EventEmitter相关知识。
在javascript中如果定义两个相同名字的方法。后者将会覆盖前者成为最终赢家。但是我们给EventEmitter注册两个相同名字的监听,Nodejs将会只两个监听事件。
//event.js 文件 var events = require(‘events‘); var emitter = new events.EventEmitter(); emitter.on(‘someEvent‘, function(arg1, arg2) { console.log(‘listener1‘, arg1, arg2); }); emitter.on(‘someEvent‘, function(arg1, arg2) { console.log(‘listener2‘, arg1, arg2); }); emitter.emit(‘someEvent‘, ‘arg1 参数‘, ‘arg2 参数‘);
//node 执行输出结果 $ node event.js listener1 arg1 参数 arg2 参数 listener2 arg1 参数 arg2 参数
我们可以从结果中看到。两次监听都被执行。并且执行顺序按注册顺序依次执行。
接着我们可以看看EventEmitter具有哪些方法
- addListener(event,listener) ,为指定事件添加监听器到监听器的尾部
- on(event,listener),为指定事件注册一个监听器,接收一个字符串event和回调函数
- once(event,listener) , 为指定事件注册一个监听器,但是此监听器只触发一次。触发过后将会解除解除
//event2.js
var eventEmitter = require(‘events‘).EventEmitter; var event = new eventEmitter(); event.once(‘test_once‘,function(){ console.log(‘test once‘); }); event.emit(‘test_once‘); event.emit(‘test_once‘);
//执行结果
4.removeListener(event,listener),移除指定事件的某个监听器,改监听器必须是改时间已注册的监听器,它接收两个参数。一个是时间名称。一个是自身回调函数
5.removeAllListener([event]) ,移除所有时间的监听器,如果指定事件则和removeListener功能相同。可接收时间数组。删掉对应事件的监听器。
6.setMaxListener(numher),默认情况下。EventEmitter只支持最大10个监听器。超过10个Nodejs将会发出警告。setMaxListener就可以用于提高监听器的默认限制。
7.listeners(event),返回指定事件的监听器数组
8.emit(event,[arg1],[arg2],[...]),按参数顺序执行每一个监听器,如果有注册监听器返回true,否则返回false。
9.listenerCount(emitter,event),返回指定监听器数量
events.EventEmitter.listenerCount(emitter, eventName) //已废弃,不推荐
events.emitter.listenerCount(eventName) //推荐
EventEmitter 定义了一个特殊的事件error,当我们遇到一次的时候通常会被触发。当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。
Buffer(缓冲区)
首先我们来看看Buffer模块的常用方法(有些方法在旧版中是没有的)
1. new Buffer(size) ,分配一个新的size大小的8位字节的Buffer (已在新版本废弃,替代者Buffer.alloc)。
2. new Buffer(buffer),拷贝参数buffer的数据到新的Buffer实例(已废弃,替代者Buffer.from(buffer))。
3. new Buffer(str[, encoding] ),分配新的buffer,包含str字符串,默认编码为utf8(已废弃,替代者Buffer.from(str[, encoding] ))。
4.buf.length,返回buffer实例的bytes数。他是对象分配的内存数,并不表示内容大小。但是会随内容大小改变而改变
5. buf.write(str[, offset[, length]][,encoding]),根据参数 offset 偏移量和指定的 encoding 编码方式,将参数 string 数据写入buffer。 offset 偏移量默认值是 0, encoding 编码方式默认是 utf8。 length 长度是将要写入的字符串的 bytes 大小。 返回 number 类型,表示写入了多少 8 位字节流。如果 buffer 没有足够的空间来放整个 string,它将只会只写入部分字符串。 length 默认是 buffer.length - offset。 这个方法不会出现写入部分字符。
6. buf.writeUIntLE(value,offset,byteLength[,noAsset]) / buf.writeIntLE(value,offset,byteLength[,noAssert]) , 将value写入到buffer中。他由offset和byteLength决定。最高支持48位无符号整数,小端对齐,noAssert默认为false需要验证value和offset的有效性,为true将不再验证。
7. buf.writeUIntBE / buf.writeIntBE (value,offset,byteLength[,noAssert]) / ,和writeUIntLE唯一的区别是writeUIntBE是大端对齐。
8. buf.readUIntLE / buf.readIntBE (offset,byteLength[, noAssert]) , 支持读取48位以下无符号,小端对齐的数字,noAssert= true,offset 不再验证是否超长,反之则验证。
9. buf.readyUIntBE / buf.readIntBE (offset, byteLength[, noAssert]) ,支持读取48位以下,大端对齐的数字,noAssert=true,offset不在验证是否超长。反之则验证。
10. buf.toString(encoding,start,end) , 根据encoding返回解码的string内心,start,end作为取值范围。
11. buf.toJSON() ,将Buffer转换成JSON对象
12. buf[index], 获取或设置指定的字节。返回值代表一个字节,所以返回值的合法范围是十六进制0x00到0xFF 或者十进制0至 255。
13. buf.equals(otherBuffer),比较两个缓冲区是否相等.
14. buf.compare(otherBuffer),比较两个Buffer是否相同。
15. buf.copy(targetBuffer,targetStart,sourceStart,sourceEnd),buffer 拷贝,源和目标可以相同。 targetStart 目标开始偏移和 sourceStart 源开始偏移默认都是 0。 sourceEnd 源结束位置偏移默认是源的长度 buffer.length
16. buf.slice(start,end),剪切 Buffer 对象,根据 start(默认是 0 ) 和 end (默认是 buffer.length ) 偏移和裁剪了索引。 负的索引是从 buffer 尾部开始计算的。
17. buf.readUInt8(offset, noAssert)根据指定的偏移量,读取一个无符号 8 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 如果这样 offset 可能会超出buffer 的末尾。默认是 false。
18. buf.readUInt16LE(offset[, noAssert]),根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
19 buf.readUInt16BE(offset[, noAssert]),根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数,大端对齐。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
20. buf.readUInt32LE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个无符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
21. buf.readUInt32BE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个无符号 32 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
22 buf.readInt8(offset[, noAssert]),根据指定的偏移量,读取一个有符号 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
23 buf.readInt16LE(offset[, noAssert]),根据指定的偏移量,使用特殊的 endian 格式读取一个 有符号 16 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
24. buf.readInt16BE(offset[, noAssert]),根据指定的偏移量,使用特殊的 endian 格式读取一个 有符号 16 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。
25. buf.readInt32LE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
26 buf.readInt32BE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个有符号 32 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
27 buf.readFloatLE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。
28. buf.readFloatBE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian 字节序格式读取一个 32 位双浮点数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer的末尾。默认是 false。
29. buf.readDoubleLE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,小端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
30. buf.readDoubleBE(offset[, noAssert]),根据指定的偏移量,使用指定的 endian字节序格式读取一个 64 位双精度数,大端对齐。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出buffer 的末尾。默认是 false。
31 buf.writeUInt8(value, offset[, noAssert]),根据传入的 offset 偏移量将 value 写入 buffer。注意:value 必须是一个合法的无符号 8 位整数。 若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则不要使用。默认是 false。
32。 buf.writeUInt16LE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的无符号 16 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
33. buf.writeUInt16BE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的无符号 16 位整数,大端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
34. buf.writeUInt32LE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式(LITTLE-ENDIAN:小字节序)将 value 写入buffer。注意:value 必须是一个合法的无符号 32 位整数,小端对齐。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
35. buf.writeUInt32BE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式(Big-Endian:大字节序)将 value 写入buffer。注意:value 必须是一个合法的有符号 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者offset可能会超出buffer的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
36. buf.writeInt8(value, offset[, noAssert])
37. buf.writeInt16LE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。
38. buf.writeInt16BE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 16 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false 。
39. buf.writeInt32LE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
40. buf.writeInt32BE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个合法的 signed 32 位整数。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
41. buf.writeFloatLE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
42. buf.writeFloatBE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer 。注意:当 value 不是一个 32 位浮点数类型的值时,结果将是不确定的。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value可能过大,或者 offset 可能会超出 buffer 的末尾从而造成 value 被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
43. buf.writeDoubleLE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
44 buf.writeDoubleBE(value, offset[, noAssert]),根据传入的 offset 偏移量和指定的 endian 格式将 value 写入 buffer。注意:value 必须是一个有效的 64 位double 类型的值。 若参数 noAssert 为 true 将不会验证 value 和 offset 偏移量参数。 这意味着 value 可能过大,或者 offset 可能会超出 buffer 的末尾从而造成value被丢弃。 除非你对这个参数非常有把握,否则尽量不要使用。默认是 false。
45 buf.fill(value[, offset][, end]),使用指定的 value 来填充这个 buffer。如果没有指定 offset (默认是 0) 并且 end (默认是 buffer.length) ,将会填充整个buffer。
我们使用了一些常用的方法。我们来看看结果。
const buf = Buffer.from(‘allen‘); console.log(‘buf.length : ‘ + buf.length); buf.write(‘hello‘,2,10,‘utf8‘); console.log(‘buf.toString() : ‘ + buf.toString()); console.log(‘buf.toJSON() : ‘ + buf.toJSON()); console.log(‘buf[index] : ‘ + buf[2]); const buf1 = Buffer.from(‘allen‘); console.log(‘buf.equals(buf1) : ‘ + buf.equals(buf1)); console.log(‘buf.compare(buf1) : ‘ + buf.compare(buf1)); console.log(‘buf.copy : ‘ + buf.copy(buf1,3,0,5) + ", toString() : " + buf.toString()); console.log(‘buf.slice() : ‘ + buf.slice(0,1) + ",toString() : " + buf.toString());
我们可以看看对应的结果:
以上是关于Nodejs - EventEmitter,Buffer的主要内容,如果未能解决你的问题,请参考以下文章
Nodejs 的 EventEmitter 和 Jquery 触发器