2015-04-23 2 views
1

Это, вероятно, нуб JavaScript вопрос, но я ищу, чтобы узнать, является ли решение проблемы, я имею «правильно»Асинхронный Рекурсия с JavaScript и Node.js

Я создал следующий пример приложения что воссоздает свою ошибку:

во-первых, в 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, который считывает файл и обращается к функции процесса, а затем вызывает функцию записи. Однако в конце функции записи выдается ошибка:

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

}; 

Все работает отлично. Это хороший способ сделать это или есть лучшее решение?

ответ

2

Я думаю, что это прекрасный способ сделать это. Существует одна возможная модификация, которую вы можете сделать. Поскольку вы создаете новое имя в своей области только с целью рекурсии, вы можете просто назвать свою функцию и ссылаться на нее по ее имени внутри функции.

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

+0

Именование функции много аккуратнее, спасибо за подсказку! –

Смежные вопросы