Это, вероятно, нуб 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);
};
};
Все работает отлично. Это хороший способ сделать это или есть лучшее решение?
Именование функции много аккуратнее, спасибо за подсказку! –