2013-03-21 69 views
1

當使用nodejs事件系統時,我遇到了一個煩人的問題。如下面的代碼所示,當偵聽器捕獲事件時,事件發射器對象在回調函數中擁有「this」而不是偵聽器。node.js EventEmitter導致範圍問題

如果將回調放入監聽器的構造函數中,這不是一個大問題,因爲除了指針'this'之外,還可以使用構造函數作用域中定義的其他變量,如'self'或'that'。

但是,如果將回調放在構造函數之外(如原型方法),則在我看來,沒有辦法獲取偵聽器的「this」。

不太確定是否有其他解決方案。此外,爲什麼nodejs事件發出使用發射器作爲偵聽器的調用者安裝有點困惑?

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

var listener = function() { 
    var pub = new publisher(); 
    var self = this; 
    pub.on('ok', function() { 
     console.log('by listener constructor this: ', this instanceof listener); 
     // output: by listener constructor this: false 

     console.log('by listener constructor self: ', self instanceof listener); 
     // output: by listener constructor this: true 
    }) 
    pub.on('ok', this.outside); 
} 

listener.prototype.outside = function() { 
    console.log('by prototype listener this: ', this instanceof listener); 
    // output: by prototype listener this: false 
    // how to access to listener's this here? 
} 

var publisher = function() { 
    var self = this; 

    process.nextTick(function() { 
     self.emit('ok'); 
    }) 
} 

util.inherits(publisher, EventEmitter); 

var l = new listener(); 
+0

https://www.npmjs.com/package/scoped-event-emitter – 2014-12-26 20:48:11

回答

5

嘗試明確結合聽者回調:

pub.on('ok', this.outside.bind(this)); 
+0

謝謝,這個作品。但是,由於項目使用了大量的事件鏈,所以在每個「開始」短語後添加這個內容仍然很煩人。其他解決方案? – Jack 2013-03-21 10:27:34

+0

我不這麼認爲,這就是JS範圍的工作原理:) – robertklep 2013-03-21 10:31:01

+0

謝謝,無論如何,這對我有很大的幫助。 – Jack 2013-03-21 10:35:45