node.js自定义事件:无法调用未定义的方法'emit'

时间:2014-01-26 14:54:23

标签: javascript node.js events

我正在学习节点,它的事件API并试图做一个简单的例子。

所以这是我的代码:

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未定义,因此程序崩溃。

我肯定错过了什么,如何让它发挥作用?

1 个答案:

答案 0 :(得分:2)

这不是Node的问题,它是JavaScript的问题。 this中的this.emit不是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));
};