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具有哪些方法

  1. addListener(event,listener) ,为指定事件添加监听器到监听器的尾部
  2. on(event,listener),为指定事件注册一个监听器,接收一个字符串event和回调函数
  3. 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());

我们可以看看对应的结果:

猜你喜欢

转载自www.cnblogs.com/allenj/p/10192235.html