出了什么问题?
p.s:我是node.js的新手,我来自.Net world!
我的server.js代码:
var events = require('events').EventEmitter;
var v = function() {
var e = new events();
e.emit('start');
};
var r = v();
r.on('start', function(){
console.log('event start just fired!!!!!!!!!!');
});
这个控制台出来了:
TypeError: Cannot read property 'on' of undefined
at Object.<anonymous> (E:\Project\node\BasicSocial\server.js:12:2)
at Module._compile (module.js:410:26)
at Object.Module._extensions..js (module.js:417:10)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Function.Module.runMain (module.js:442:10)
at startup (node.js:136:18)
at node.js:966:3
答案 0 :(得分:8)
您忘记从v
函数返回事件发射器:
var v = function() {
var e = new events();
e.emit('start');
return e;
};
另请注意,由于您在订阅之前已发出事件,因此不会调用start
事件。所以你可以稍微修改你的代码:
var events = require('events').EventEmitter;
var v = function() {
var e = new events();
return e;
};
var r = v();
r.on('start', function(){
console.log('event start just fired!!!!!!!!!!');
});
// emit the event after you have subscribed to the start callback
r.emit('start');
答案 1 :(得分:1)
r
未定义,因为v
没有返回任何内容。这就是你收到错误的原因。即使您返回该活动,您的代码也无法提供所需的输出,因为您需要在使用on("start")
之前使用emit("start")
var events = require('events').EventEmitter;
var e = new events();
e.emit('start'); //This won't trigger the console.log
//Need to be binded before you emit the event.
e.on('start', function(){
console.log('event start just fired!!!!!!!!!!');
});
e.emit('start'); //This will trigger the console.log
答案 2 :(得分:0)
您也可以使用Process.nextTick()
或setTimeout(yourFunction,0)
。
这两个函数在发出和使用回调函数时会很方便。
在这里,使用nextTick
函数,我可以在事件循环中推送该函数,该事件循环将在调用堆栈中的所有进程都执行完之后即最后执行。
var EventEmitter = require('events').EventEmitter;
var getValue = function(val){
var e = new EventEmitter();
process.nextTick(function(){
var c = 0;
e.emit('Start');
var t = setInterval(function(){
e.emit('Processing data', ++c);
if(c==val){
e.emit('Stopped',c);
clearInterval(t);
}
},10);
});
return e;
}
var r = getValue(7);
r.on('Start', function(){
console.log("Started");
});
r.on('Processing data', function(d){
console.log('Data '+d);
});
r.on('Stopped', function(d){
console.log('Stopped '+d)
});
答案 3 :(得分:0)
在制作事件对象之前,您必须忘了编写新内容
const events=require("events");
const event=***new*** events.EventEmitter();
event.on('click' ,() => console.log("hello"));
event.emit('click');