具有多种功能的导出模块

时间:2018-08-10 19:01:22

标签: javascript node.js

我是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)

2 个答案:

答案 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是未定义的,因为它不是其模块内的全局函数,而是在另一个函数内。

另一个细节是,您需要返回带有发出名称的回调才能使用它