在节点js

时间:2018-02-06 08:39:39

标签: node.js

我正在学习节点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){...} 不检查并结束循环?

2 个答案:

答案 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)。