菜鸟教程里的粗略学习
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");
全局变量
- 参考手册 全局对象(Process等)
- 常用工具 常用工具