使用 JavaScript 和 Node.js 的异步递归
Async Recursion with JavaScript and Node.js
这可能是一个菜鸟 JavaScript 问题,但我想知道我对我遇到的问题的解决方案是否是 'correct'
我创建了以下重现错误的示例应用程序:
首先在index.js
var processor = require('./fileProcessor/processor.js');
var container = {
source: "source.txt",
destination: "destination.txt"
};
new processor().process(container);
我创建了我的容器对象,它具有源文件的名称和目标文件的名称。这个传入处理器的process函数:
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,它读取文件并回调到处理函数,然后调用写入函数。但是在写入函数的末尾会抛出一个错误:
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);
};
};
一切正常。这是一个很好的方法还是有更好的解决方案?
我认为这是一个很好的方法。您可能会进行一种可能的修改。由于您只是为了递归的目的在您的范围内创建一个新名称,您可以只命名您的函数并在函数内部通过它的名称引用它。
module.exports = function Processor() {
this.process = function processFunction(container) {
var file = new fileProcessor();
if(container.finished === undefined) {
if(container.body === undefined) {
file.read(container, processFunction);
} else {
file.write(container, processFunction);
}
}
};
};
那么您就可以避免创建在函数外部可见的名称 (processFunction
)。
这可能是一个菜鸟 JavaScript 问题,但我想知道我对我遇到的问题的解决方案是否是 'correct'
我创建了以下重现错误的示例应用程序:
首先在index.js
var processor = require('./fileProcessor/processor.js');
var container = {
source: "source.txt",
destination: "destination.txt"
};
new processor().process(container);
我创建了我的容器对象,它具有源文件的名称和目标文件的名称。这个传入处理器的process函数:
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,它读取文件并回调到处理函数,然后调用写入函数。但是在写入函数的末尾会抛出一个错误:
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);
};
};
一切正常。这是一个很好的方法还是有更好的解决方案?
我认为这是一个很好的方法。您可能会进行一种可能的修改。由于您只是为了递归的目的在您的范围内创建一个新名称,您可以只命名您的函数并在函数内部通过它的名称引用它。
module.exports = function Processor() {
this.process = function processFunction(container) {
var file = new fileProcessor();
if(container.finished === undefined) {
if(container.body === undefined) {
file.read(container, processFunction);
} else {
file.write(container, processFunction);
}
}
};
};
那么您就可以避免创建在函数外部可见的名称 (processFunction
)。