关于process.nextTick()的一个疑问
发布于 7 年前 作者 lei2231 3707 次浏览 来自 问答

在学习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

7 回复

程序是顺序执行的,当StreamLibrary 被new的时候,先执行emit('start),执行完之后才会on(‘start’) ,所以start永远不会被触发,那为什么emit(‘data’)可以触发on(‘data’)了呢?因为在emit(‘data’)之前,异步了…所以会先执行on(‘data’),再执行emit(‘data’)

@Fov6363 什么机制使 在emit(‘data’)之前 异步了呢? 或者说 为啥在emit(‘data’)之前 会发生异步呢?

@lei2231 process.nextTick 使得 emit 操作在事件循环的本 tick 和下一个 tick 之间执行了,而你的 on 操作是在本 tick 执行的,这样子保证了 emit 之前 on 一定是准备好的

来自酷炫的 CNodeMD

@hyj1991 了解了,你分享的那个内存检测工具很不错,会一直关注~

@vincentLiuxiang 你推荐的这篇文章讲的很细,有收获,非常感谢

回到顶部