使用JavaScript和Node.js进行asynchronousrecursion

这可能是一个noob的JavaScript问题,但我期待知道我的解决scheme是否是“正确的”

我创build了下面的示例应用程序,重新创build我的错误:

首先在index.js中

var processor = require('./fileProcessor/processor.js'); var container = { source: "source.txt", destination: "destination.txt" }; new processor().process(container); 

我创build了我的容器对象,它具有源文件的名称和目标文件的名称。 这被传递给处理器的处理function:

 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到进程函数中,然后调用write函数。 但是,在写入函数结束时会抛出一个错误:

  callback(container); ^ TypeError: object is not a function 

显然在传入this.process的时候file.write(container, this.process); this不是我想要的!

如果我通过添加一个processFunctionvariables来更新我的处理器:

 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); }; }; 

一切工作正常。 这是一个好办法,或者有更好的解决scheme?

我认为这是一个很好的做法。 您可能会做出一个可能的修改。 既然你在范围内创build一个新的名字只是为了recursion的目的,你可以给你的函数命名,并在函数内用名字引用它。

 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); } } }; }; 

然后你可以避免创build一个名字( processFunction ),这个名字在函数之外是可见的。

看看这里参考: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function#Named_function_expression