我正在学习节点,它的事件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
未定义,因此程序崩溃。
我肯定错过了什么,如何让它发挥作用?
答案 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));
};