2014-01-26 112 views
1

我正在學習節點,它的事件API並試圖做一個簡單的例子。node.js自定義事件:無法調用未定義的方法'emit'

因此,這裏是我的代碼:

var fs = require('fs'); 
var util = require('util'); 
var events = require('events'); 
var FileLoader = function() { 
    events.EventEmitter.call(this); 
    this.load = function (url) { 
     fs.readFile(url, function (err, data) { 
      if (err) { 
       throw err; 
      } else { 
       this.emit('loaded', data.toString()); 
      } 
     }); 
    }; 
}; 
util.inherits(FileLoader, events.EventEmitter); 
module.exports = FileLoader; 

我想load()一個文本文件,在加載時,與.on('loaded',function(){...})抓住它,但this是不確定的,所以程序崩潰。

我絕對缺少一些東西,如何使它工作?

回答

2

這不是Node的問題,這是JavaScript的問題。 this.emit中的this不是FileLoader實例。

我建議您閱讀關於JavaScript中this的行爲。 MDN docs for this可能對您有所幫助。

在這種情況下,你需要將this綁定你readFile回調內部,使得內this是外this加入.bind(this)到您的回調。

this.load = function (url) { 
    fs.readFile(url, function (err, data) { 
     if (err) { 
      throw err; 
     } else { 
      this.emit('loaded', data.toString()); 
     } 
    }.bind(this)); 
}; 
+0

我懷疑'this.emit'中的_'this'不是'FileLoader'實例_,並且需要一種將'this'傳遞給回調函數的方法。 'bind()'是我尋找的方式,謝謝。 – amdc

相關問題