【发布时间】:2015-07-02 04:05:03
【问题描述】:
这可能是一个 JavaScript 新手问题,但我想知道我对遇到的问题的解决方案是否“正确”
我创建了以下示例应用程序来重现我的错误:
首先在 index.js 中
var processor = require('./fileProcessor/processor.js');
var container = {
source: "source.txt",
destination: "destination.txt"
};
new processor().process(container);
我创建了具有源文件名和目标文件名的容器对象。这被传递到处理器的进程函数中:
var fileProcessor = require('./fileProcessor.js');
module.exports = function Processor() {
this.process = function(container) {
var file = new fileProcessor();
if(container.finished === undefined) {
if(container.body === undefined) {
file.read(container, this.process);
} else {
file.write(container, this.process);
}
}
};
};
如你所见,这调用了容器中传入的读写函数和作为回调的进程函数,fileProcessor看起来像这样:
var fs = require('fs');
module.exports = function() {
this.read = function(container, callback) {
fs.readFile(container.source, function (err, data) {
if(err) throw err;
container.body = data;
callback(container);
});
};
this.write = function(container, callback) {
fs.writeFile(container.destination, container.body, function(err) {
if(err) {
return console.log(err);
}
container.finished = true;
callback(container);
});
};
};
简单来说,处理器调用file.read,它读取文件并回调到process函数,然后调用write函数。但是在写函数结束时会抛出一个错误:
callback(container);
^
TypeError: object is not a function
显然,当将this.process 传递给file.write(container, this.process); 时,this 不是this 我打算这样!
如果我通过添加processFunction 变量来更新我的处理器:
var fileProcessor = require('./fileProcessor.js');
module.exports = function Processor() {
var processFunction = function(container) {
var file = new fileProcessor();
if(container.finished === undefined) {
if(container.body === undefined) {
file.read(container, processFunction);
} else {
file.write(container, processFunction);
}
}
};
this.process = function(container) {
processFunction(container);
};
};
一切正常。这是执行此操作的好方法还是有更好的解决方案?
【问题讨论】:
标签: javascript node.js asynchronous recursion