我正在学习节点js并需要一些澄清。
var EventEmitter = require('events').EventEmitter;
var getResource = function(c) {
var emitter = new EventEmitter();
process.nextTick(function() {
var count = 0;
emitter.emit("start")
var t = setInterval(function() {
c
emitter.emit("data", ++count);
if (count === c) {
emitter.emit("end");
//clearInterval(t);
}
}, 1000)
});
return emitter;
}
var r = getResource(5);
r.on("start", function() {
console.log("I have started");
})
r.on("data", function(d) {
console.log("Received " + d);
})
r.on("end", function() {
console.log("I have ended");
})
如果我取消注释setInterval部分,它的行为符合预期,即。,打印数据直到5,并发出结束事件。
如果我对其进行评论,则会打印数据直到5并发出结束事件。之后,它以无限循环运行并连续打印。为什么是我的代码 if(count === c){...} 不检查并结束循环?
答案 0 :(得分:0)
在调用
clearInterval
之前,setInterval
将执行代码 在经常性的时间间隔。
请参阅Timers上的NodeJs文档。
答案 1 :(得分:0)
emit
方法是通用方法。它只是发出一个事件&可选择传递数据。
emitter.emit(eventName, data);
其中eventName
是一个字符串& data
是一个任意值。
程序员可以根据要求使用它。
将end
作为事件名称传递对emit
方法没有任何意义,对于该方法,它只是另一个调用。在您的情况下,实际结束clearInterval
事件需要data
。只有事件的接收者,end
事件才有意义。
因此,如果您发出end
事件,接收方将知道不会再发生data
事件。
考虑向接收者发送end
事件作为信号。但是,您必须确保在data
事件之后没有其他事件(end
)。