2017-09-20 125 views
0

我不知道我的代碼有什麼問題。事件沒有被髮射或​​他們沒有被捕獲nodejs

// emitter.js 
var EventEmitter = require('events').EventEmitter; 
var util = require('util'); 
function Loadfun(param1, param2, db){ 
    function __error(error, row){ 
     if(error){ 
      this.emit('error', error); 
      return true; 
     } 
     if(row.length < 1) 
      this.emit('failure'); 
    } 
    function doSomething(){ 
     db.query('select something', callback); 
    } 
    function callback(err, result){ 
     if(__error(error)) 
      return false; 
     else 
      this.emit('success', result); 
    } 
    this.doSomething = doSomething; 
}; 
util.inherits(Loadfun,EventEmitter); 
module.exports = Loadfun; 

這是發射器功能。 和我使用這個一些同步數據庫的作品。 以下是調用函數。

var emitter = require('emitter'); 
router('/fetch', function(req, res){ 
    var fetch = new emitter(param1, param2, db); 
    fetch.on('failure', function(){ 
     console.log('error'); 
    }); 
    fetch.on('success', function(data){ 
     console.log(JSON.stringify(data)); 
    }); 
    fetch.doSomething(); 
}); 

這工作完好,沒有任何錯誤。 我試圖記錄流量,直到放射成功 但捕獲的事件發射沒有被記錄.. 我不明白是什麼問題..這將是很好,如果有人可以幫助。

回答

0

2的事情,我可以很快看到的是:

  1. 你是路過這是沒有定義的錯誤if(__error(error))
  2. 您調用回調函數範圍this.emit,它是指向db.query而不是EventEmitter

你必須綁定this到您的回調。 執行以下操作將適用於您db.query('select something', callback.bind(this)); 但您還必須解決第一個提到的「錯誤」。

+0

感謝您的答覆.. 問題是與此指針..現在它的工作正常 –

+0

檢查以下鏈接的深度信息關於'這個' https://github.com/getify/You-Dont-Know-JS/blob/master/this%20& %20object%20prototypes/README.md#you-dont-know-js-this - object-prototypes –

0

在您的大部分代碼中,您在錯誤的上下文中使用關鍵字this。與function關鍵字聲明的每個函數,都有自己的this背景,所以當內部__error例如this你指的是不是LoadFunthis,所以它是不是因此延長EventEmitter類不排放任何類。

您可以撥打電話時將它們綁定你的功能,或使用箭頭功能,或分配給另一個變量,例如與此分配給另一個變量:

function Loadfun(param1, param2, db){ 
    var self = this; 
    function __error(error, row){ 
     if(error){ 
      self.emit('error', error); 
      return true; 
     } 
     if(row.length < 1) 
      self.emit('failure'); 
    } 
    function doSomething(){ 
     db.query('select something', callback); 
    } 
    function callback(err, result){ 
     if(__error(err)) 
      return false; 
     else 
      self.emit('success', result); 
    } 
    self.doSomething = doSomething; 
}; 
+0

感謝您的回覆..問題出在這個指針上。現在它的工作正常:) –

相關問題