2016-08-04 2 views
0

Я не уверен, где я ошибаюсь, но я думаю, что прослушиватель событий вызывается несколько раз и разбора файлов несколько раз.Как использовать функцию Node.JS foreach с событием listerner

У меня есть пять файлов в каталоге, и они получают синтаксический анализ. Однако файл pdf с массивом 0 анализируется один раз, а второй - два и три раза три раза.

Я хочу, чтобы каждый файл в каталоге обрабатывался один раз и создавал текстовый файл, извлекая данные из pdf.

Идея состоит в том, чтобы разобрать pdf, получить содержимое в виде текста и преобразовать текст в json в определенном формате.

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

Надеюсь, что кто-нибудь может помочь и указать, где я иду не так, и немного рассказать о своей ошибке, поэтому я понимаю это. (Новый в JS и Node)

С уважением, Джай

Использование модуля здесь: https://github.com/modesty/pdf2json

var fs = require('fs') 
    PDFParser = require('C:/Users/Administrator/node_modules/pdf2json/PDFParser') 
    var pdfParser = new PDFParser(this, 1) 

    fs.readdir('C:/Users/Administrator/Desktop/Project/Input/',function(err,pdffiles){ 
     //console.log(pdffiles) 
     pdffiles.forEach(function(pdffile){ 
     console.log(pdffile) 
     pdfParser.once("pdfParser_dataReady",function(){ 
      fs.writeFile('C:/Users/Administrator/Desktop/Project/Jsonoutput/'+pdffile, pdfParser.getRawTextContent())  
      pdfParser.loadPDF('C:/Users/Administrator/Desktop/Project/Input/'+pdffile) 
     }) 
     })   
    }) 
+0

Код, который у вас там, выглядит правильно для меня. Я попытался найти документацию для 'pdfParser.once', но не смог найти ее. У меня есть подозрение, что он, вероятно, имеет какое-то отношение к '.once' api. –

+0

Привет, Сэмюэль, спасибо за ввод. Если я удаляю .once и использую .on, чтобы проверить, когда прослушиватель событий включен, файлы обрабатываются несколько раз. Более 20 раз, поэтому в текстовом файле я получаю что-то вроде этого имени: testtestetstetsttesttesttest, а не только как имя: test. – user1222256

+0

Возможно, ошибка для модуля анализатора, который вы используете. Если производительность не вызывает беспокойства, вы можете подумать об этом синхронно и посмотреть, работает ли она. Если вы заинтересованы в синхронном управлении асинхронными вызовами, я могу исправить несколько идей в качестве решения. –

ответ

0

Как уже упоминалось в комментариях, только способствует 'обходным' идеи OP для временного решения этой проблемы.

Предполагая, что производительность не является проблемой, вы должны асинхронно анализировать файлы PDF в последовательном материале. То есть, только разобрать следующий файл, когда первый будет выполнен.

К сожалению, я никогда не использовал модуль npm PDFParser, поэтому мне очень сложно попробовать код ниже. Простите меня, так как это может потребовать некоторых незначительных ухищрений, чтобы заставить работать, синтаксически они должны быть прекрасными, поскольку они были написаны с использованием IDE.

Пример:

var fs = require('fs'); 
PDFParser = require('C:/Users/Administrator/node_modules/pdf2json/PDFParser'); 

var parseFile = function(files, done) { 
    var pdfFile = files.pop(); 

    if (pdfFile) { 
     var pdfParser = new PDFParser(); 
     pdfParser.on("pdfParser_dataError", errData => { return done(errData); }); 
     pdfParser.on("pdfParser_dataReady", pdfData => { 
      fs.writeFile("'C:/Users/Administrator/Desktop/Project/Jsonoutput/" + pdfFile, JSON.stringify(pdfData)); 
      parseFile(files, done); 
     }); 
     pdfParser.loadPDF('C:/Users/Administrator/Desktop/Project/Input/' + pdfFile); 
    } 
    else { 
     return done(null, "All pdf files parsed.") 
    } 
}; 

fs.readdir('C:/Users/Administrator/Desktop/Project/Input/',function(err,pdffiles){ 
    parseFile(pdffiles, (err, message) => { 
     if (err) { console.error(err.parseError); } 
     else { console.log(message); } 
    }) 
}); 

В приведенной выше коде, я выделил из логики синтаксического анализа в отделенной функцию, называемой parseFile. В этой функции он сначала проверяет, есть ли еще файлы для обработки или нет, если нет, то он вызывает функцию обратного вызова done, иначе он выполнит операцию array.pop, чтобы получить следующий файл в очереди и начнет его разбор.

Когда выполняется синтаксический анализ, он рекурсивно вызывает функцию parseFile до тех пор, пока не будет проанализирован последний файл.

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