使用 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)。

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