CNode

关于process.nextTick()的一个疑问

问答
Llei2231发布于9 年前最后回复9 年前7 回复5205 浏览0 收藏

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

F
Fov6363#1·9 年前

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

L
lei2231#4·9 年前
引用 Fov6363程序是顺序执行的,当StreamLibrary 被new的时候,先执行emit('start),执行完之后才会on('start') ,所以start永远不会被触发,那为什么emit('dat...

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

H
hyj1991#5·9 年前
引用 lei2231@Fov6363 什么机制使 在emit('data')之前 异步了呢? 或者说 为啥在emit('data')之前 会发生异步呢?

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

来自酷炫的 CNodeMD

L
lei2231#7·9 年前
参与回复
登录后即可参与回复。登录