2013-10-20 51 views
0

我是Node.js的新手,並且在調試問題時遇到問題。我創建了一個充當事件發射器的對象,但是,當事件發出時,我的回調函數不會被調用。從EventEmitter繼承的對象不會引發事件

我定義我的發射器如下:

var EventEmitter = require('events').EventEmitter; 
var util = require('util'); 

// this is the object which will inherit from EventEmitter 
function RequestStreamReader() { 
    EventEmitter.call(this); 
} 
util.inherits(RequestStreamReader, EventEmitter); 
module.exports = RequestStreamReader; 

RequestStreamReader.prototype.read = function(req) { 
    var data = ''; 
    req.on('data', function(chunk){ 
     data += chunk; 
    }); 
    req.on('end', function() { 
     this.emit('readComplete', data); 
    }); 
}; 

消耗該模塊列在下面的代碼。儘管在發射器中調用了this.emit(...)(我已在調試器中對此進行了驗證),但我的「readComplete」事件處理程序仍未執行。

var Reader = require("../utils/requestStreamReader.js"); 

var reader = new Reader(); 
reader.on('readComplete', function(data){ 
    var userData = JSON.parse(data); 
    var newUser = userModule.createFromDto(userData); 
    userRepository.create(newUser, onSuccess, onFailure); 
}); 
reader.read(req); 

關於我可能做錯什麼的想法?

謝謝!

回答

1

原因是「this」不是你認爲它在你的代碼中,你試圖撥打this.emit('readComplete', data)。在這種情況下,「this」是指回調函數而不是封閉對象。你需要做的:

RequestStreamReader.prototype.read = function(req) { 
    var data = ''; 
    var self = this; 
    req.on('data', function(chunk){ 
     data += chunk; 
    }); 
    req.on('end', function() { 
     self.emit('readComplete', data); 
    }); 
}; 

,你甚至可以看到相同的技術在工作中的實際源裏面的Node.js本身:https://github.com/joyent/node/blob/master/lib/http.js#L80

+0

真棒的感謝!我懷疑這不是唯一一次我遇到'this'關鍵字引起的問題。 – Kartik

+0

很好的概述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this – ksimons