我是node的新手,我正在尝试学习使用导出模块使我的代码更易于阅读的不同方法,因为它们位于单独的文件中。我想将我的程序响应函数从callback.js文件中取出,并将它们移到一个名为progresponse.js的单独文件中,但是由于它没有读取Emitter.js文件上的emit方法,所以出现了错误。 generator.js和callback.js代码有效。但我正在尝试使generator.js,wanttomodularize.js和progresponses.js代码正常工作。
我的progresponses.js和wanttomodularize.js代码是我尝试分离该代码的尝试。这段代码给出的错误是它无法识别某些generator.js方法。
如果很多事情和我的学习很具体,我会提前道歉,但是有人可以告诉我如何将黑体文本从callback.js中取出并放入一个单独的文件(progresponse.js)中吗?
emitter.js
function Emitter(){
this.events = {};
}
Emitter.prototype.on = function( type, listener){
this.events[type] = this.events[type] || [];
this.events[type].push(listener);
}
Emitter.prototype.emit = function(type){
if(this.events[type]){
this.events[type].forEach(function(listner){
listner();
});
}
}
module.exports = Emitter;
callback.js(此代码适用于generator.js)
var Emitter = require('./emitter.js');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'Speak Chinese> '
});
var user = {
"name" : "something",
"response" : ""
};
var emtr = new Emitter();
function 你好(callback) {
var data = {
programResponse: '你好!'
};
console.log(data.programResponse);
callback(data);
}
function 你在干什么(callback) {
emtr.on('你在干什么', function(){
console.log('我在喝咖啡。');
console.log(user.name +',你呢,你在干什么?');
});
callback();
}
function 你猜猜(callback) {
emtr.on('你猜猜', function(){
console.log('我不知道。'+ user.name +',你在干什么?');
});
callback();
}
function 对(callback) {
emtr.on('对', function(){
console.log('真棒');
});
callback();
}
rl.question('What is your name? ', (answer) => {
// TODO: Log the answer in a database
user.name = answer;
console.log(`Thank you for your valuable feedback: ${answer}`);
});
rl.prompt();
rl.on('line', (line) => {
switch (line.trim()) {
case '你好':你好(function(){});
break;
case '你在干什么':你在干什么(function(){emtr.emit('你在干什么')});
break;
case '你猜猜':你猜猜(function(){emtr.emit('你猜猜')});
break;
case '对':对(function(){emtr.emit('对')});
break;
default:
console.log(`Interesting, you said '${line.trim()}'?`);
break;
}
rl.prompt();
}).on('close', () => {
console.log('再见!');
process.exit(0);
});
wanttomodularize.js
var Emitter = require('./emitter.js');
var callback = require('./progresponses.js');
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'Speak Chinese> '
});
var user = {
"name" : "something",
"response" : ""
};
rl.question('What is your name? ', (answer) => {
// TODO: Log the answer in a database
user.name = answer;
console.log(`Thank you for your valuable feedback: ${answer}`);
});
rl.prompt();
rl.on('line', (line) => {
switch (line.trim()) {
case '你好':callback.你好(function(){});
break;
case '你在干什么':callback.你在干什么(function(){callback.emtr.emit('你在干什么')});
break;
case '你猜猜':callback.你猜猜(function(){callback.emtr.emit('你猜猜')});
break;
case '对':callback.对(function(){callback.emtr.emit('对')});
break;
default:
console.log(`Interesting, you said '${line.trim()}'?`);
break;
}
rl.prompt();
}).on('close', () => {
console.log('再见!');
process.exit(0);
});
progresponses.js
var Emitter = require('./emitter.js');
var emtr = new Emitter();
module.exports = {
你好: function 你好(callback) {
var data = {
programResponse: '你好!'
};
console.log(data.programResponse);
callback(data);
},
你在干什么: function 你在干什么(callback) {
emtr.on('你在干什么', function(){
console.log('我在喝咖啡。');
console.log(user.name +',你呢,你在干什么?');
});
callback();
},
你猜猜: function 你猜猜(callback) {
emtr.on('你猜猜', function(){
console.log('我不知道。'+ user.name +',你在干什么?');
});
callback();
},
对: function 对(callback) {
emtr.on('对', function(){
console.log('真棒');
});
callback();
}
}
这是我在运行时遇到的错误:
节点wanttomodularize.js
Bretts-MacBook-Pro:clinput codesankofa$ node wanttomodularize.js
What is your name? DOM
Thank you for your valuable feedback: DOM
你在干什么
readline.js:1021
throw err;
^
TypeError: Cannot read property 'emit' of undefined
at /Users/codesankofa/CodingWorkspace/NodePractice/clinput/wanttomodularize.js:28:58
at Object.你在干什么 (/Users/codesankofa/CodingWorkspace/NodePractice/clinput/progresponses.js:21:5)
at Interface.rl.on (/Users/codesankofa/CodingWorkspace/NodePractice/clinput/wanttomodularize.js:28:27)
at emitOne (events.js:116:13)
at Interface.emit (events.js:211:7)
at Interface._onLine (readline.js:282:10)
at Interface._line (readline.js:631:8)
at Interface._ttyWrite (readline.js:911:14)
at ReadStream.onkeypress (readline.js:160:10)
at emitTwo (events.js:126:13)
答案 0 :(得分:1)
您正在使用来自回调的emtr,但尚未将其分配给导出的对象。您需要在导出之前将其包括在内。
// wanttomodularize.js
var callback = require('./progresponses.js');
//...
callback.emtr.emit
// progresponses.js
module.exports = {
emtr, // <-----
你好: function 你好(callback) {
var data = {
programResponse: '你好!'
};
console.log(data.programResponse);
callback(data);
},
答案 1 :(得分:1)
emtr是未定义的,因为它不是其模块内的全局函数,而是在另一个函数内。
另一个细节是,您需要返回带有发出名称的回调才能使用它