【问题标题】:Async Recursion with JavaScript and Node.js使用 JavaScript 和 Node.js 进行异步递归
【发布时间】: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


    【解决方案1】:

    我认为这是一个很好的方法。您可能会进行一种可能的修改。由于您在范围内创建一个新名称只是为了递归,您可以只命名您的函数并在函数内部通过其名称引用它。

    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

    【讨论】:

    • 函数命名更简洁,感谢提示!
    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2014-04-29
    • 2017-08-11
    相关资源
    最近更新 更多