在学习node -> process.nextTick()的时候看到下面一段,以下内容来自原文引用:
写一个库实现这样的功能:从源文件里读取数据,当读取完毕后,触发一个事件同时传递读取的数据。可能你会这样写:
var EventEmitter = require(‘events’).EventEmitter;
function StreamLibrary(resourceName) {
this.emit(‘start’);
// read from the file, and for every chunk read, do:
this.emit(‘data’, chunkRead);
}
StreamLibrary.prototype.proto = EventEmitter.prototype; // inherit from EventEmitter
下面是一段调用这个库的客户端程序,我们想在程序中监听这些事件:
var stream = new StreamLibrary(‘fooResource’);
stream.on(‘start’, function() {
console.log(‘Reading has started’);
});
stream.on(‘data’, function(chunk) {
console.log('Received: ’ + chunk);
});
但是上面的代码中,将永远接收不到“start”事件,因为在这个库实例化的时候,“start”事件会被立刻触发执行,但此时事件的回调函数还没有准备好,所以在客户端根本无法接收到这个事件。同样,我们可以用process.nextTick()来改写事件触发的过程,下面是一个正确的版本:
function StreamLibrary(resourceName) {
var self = this;
process.nextTick(function() {
self.emit(‘start’);
});
// read from the file, and for every chunk read, do:
this.emit(‘data’, chunkRead);
}
引用结束
我想问的是: …在这个库实例化的时候,“start”事件会被立刻触发执行,但此时事件的回调函数还没有准备好… 为啥回调还没准备好?
原文出处:http://www.oschina.net/translate/understanding-process-next-tick?print
程序是顺序执行的,当StreamLibrary 被new的时候,先执行emit('start),执行完之后才会on(‘start’) ,所以start永远不会被触发,那为什么emit(‘data’)可以触发on(‘data’)了呢?因为在emit(‘data’)之前,异步了…所以会先执行on(‘data’),再执行emit(‘data’)
EventEmitter是同步的,process.nextTick是异步的, https://github.com/vincentLiuxiang/mybook/blob/master/book/通过源码分析(libuv)Event_Loop.md
@Fov6363 什么机制使 在emit(‘data’)之前 异步了呢? 或者说 为啥在emit(‘data’)之前 会发生异步呢?
@hyj1991 了解了,你分享的那个内存检测工具很不错,会一直关注~
@vincentLiuxiang 你推荐的这篇文章讲的很细,有收获,非常感谢