菜鸟教程里的粗略学习

EventEmitter

  • 格式
var events=require('events')
var event=new events.EventEmitter();//实例化

event.on('事件名',callback);//绑定事件[添加监听器]
event.emit('事件名');触发事件

对于每个事件,可以有多个事件监听器即,eventName相同,有多个callback(可以相同,可以不同) 如:

var callback = function (x, y) {
    console.log("listener", x, y);
}
event.on('some_event', callback);
event.once('some_event', callback);//多次emit只会触发一次
event.addListener('some_event', callback);
//结果:listener x y  listener x y  listener x y
  • removeListener(event,listener)
    这里需要注意的是,第二个参数必须是事先定义好的回调函数的名称,必须是名称,不能是匿名函数。
  • removeAllListeners([eventName])
    移除所有的监听器,若[eventName]指定,则移除所有的[eventName]事件。
  • listeners(eventName)
    返回所有eventName的监听器数组
var event=new require('events').EventEmitter();

var callback=function(){
    console.log('sth');
}
event.on('sth',callback);
event.on('sth',callback);
event.on('sth',callback);

var list=event.listeners('sth');
//list:[callback,callback,callback]
list[0];//结果:sth
  • emit(eventName,[arg1],[arg2],[...])
    简单来说动态往callback里传参
  • listenerCount(eventName)
    返回事件的监听器数量,犹豫once使用一次后就会解除绑定,所以不会被统计在内。
  • 继承EventEmitter
    大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。参见上一篇里的继承

Stream(流)

  • 对http发起请求的request对象就是一个Stream,还有stdout(标准输出)。
  • Node.js中,Stream有四种流类型
    • Readable 可读操作
    • Writable 可写操作
    • Duplex 可读可写
    • Transform 操作被写入数据,然后读出结果
  • 所有的Stream对象都是```EventEmitter的示例。常用的事件有:
    • data 当有数据可读时触发
    • end 没有更多数据可读时触发
    • error 接收和写入过程中发生错误时触发
    • finish 所有数据已被写入到底层系统时触发

从流中读取数据

var fs = require('fs');

var data = "";

var readerStream = fs.createReadStream('ex.html');//创建流
readerStream.setEncoding('utf8');

//处理流事件
readerStream.on('data', chunk => {
    data += chunk;
})
readerStream.on('end', () => {
    console.log(data);
})
readerStream.on('error', err => {
    console.log(err.stack);
})
console.log( 'done!');

写入流

//本段代码写在上段代码的'end'事件中,直接将上面读取的data写入到另一个文件中
 var writeStream = fs.createWriteStream('ex1.html');
    writeStream.write(data, 'utf8');
    writeStream.end();//标记结束

    writeStream.on('finish', () => {
        console.log('write done');
    })
    writeStream.on('error', err => {
        console.log(err.stack);
    })

pipe管道

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。

//上面的两段代码可以通过管道简化
var fs = require('fs');

var read = fs.createReadStream('read.html');
var output = fs.createWriteStream('output.html');

read.pipe(output);
console.log("done");

全局变量