Node.js 无法读取未定义的 属性 'on'
Node.js Cannot read property 'on' of undefined
怎么了?
p.s。 : 我是 node.js 的新手,我来自 .Net 世界!
我的 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
您忘记了 return 来自 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');
r
未定义,因为 v
没有 return 任何东西。这就是你收到错误的原因。即使您 return 事件,您的代码也不会为您提供所需的输出,因为您需要在使用 emit("start")
之前使用 on("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
您也可以使用 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)
});
制作事件对象前一定要忘记写new
const events=require("events");
const event=***new*** events.EventEmitter();
event.on('click' ,() => console.log("hello"));
event.emit('click');
怎么了?
p.s。 : 我是 node.js 的新手,我来自 .Net 世界!
我的 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
您忘记了 return 来自 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');
r
未定义,因为 v
没有 return 任何东西。这就是你收到错误的原因。即使您 return 事件,您的代码也不会为您提供所需的输出,因为您需要在使用 emit("start")
on("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
您也可以使用 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)
});
制作事件对象前一定要忘记写new
const events=require("events");
const event=***new*** events.EventEmitter();
event.on('click' ,() => console.log("hello"));
event.emit('click');