У меня есть сервер NodeJS, управляющий некоторыми файлами. Он будет наблюдать за известным именем файла от внешнего процесса и, как только получит, прочитает его и затем удалит его. Однако иногда его пытаются прочитать / удалить до того, как файл будет «разблокирован» от предыдущего использования, поэтому, скорее всего, время от времени произойдет сбой. Что я хотел бы сделать, так это как можно скорее повторить попытку файла, либо сразу после его завершения, либо непрерывно в быстром темпе.
Я бы предпочел избегать длительного сна, где это возможно, потому что это нужно обрабатывать как можно скорее, и каждая секунда считается.
fs.watchFile(intput_json_file, {interval: 10}, function(current_stats, previous_stats) {
var json_data = "";
try {
var file_cont = fs.readFileSync(input_json_file); // < TODO: async this
json_data = JSON.parse(file_cont.toString());
fs.unlink(input_json_file);
} catch (error) {
console.log("The JSON in the could not be parsed. File will continue to be watched.");
console.log(error);
return;
}
// Else, this has loaded properly.
fs.unwatchFile(input_json_file);
// ... do other things with the file's data.
}
// set a timeout for the file watching, just in case
setTimeout(fs.unwatchFile, CLEANUP_TIMEOUT, input_json_file);
Я ожидаю «EBUSY: ресурс занят или заблокирован» иногда появляется, но fs.watchFile
не всегда вызывается, когда файл разблокирован.
Я думал о создании функции и последующем ее вызове с задержкой в 1-10 мс, где она могла бы вызываться сама, если это тоже не удается, но это похоже на быстрый путь к ... кашель переполнение стека.
Я также хотел бы избежать синхронных методов, чтобы они хорошо масштабировались, но, будучи относительно новым для NodeJS, все обратные вызовы начинают превращаться в лабиринт.