如何使用Event.JS foreach函数与事件listerner

时间:2016-08-04 08:25:20

标签: node.js for-loop event-listener

我不确定我的错误在哪里,但我认为事件监听器被多次调用并多次解析文件。

我在目录中有五个文件,它们正在被解析。但是,带有数组0的pdf文件将被解析一次,下一个被解析两次,第三次被解析三次。

我希望解析目录中的每个文件,并通过从pdf中提取数据来创建文本文件。

理念是解析pdf获取内容为文本,并以特定格式将文本转换为json。

为简单起见,计划是首先完成一项任务,然后使用以下代码的输出来执行下一项任务。

希望任何人都可以提供帮助并指出我哪里出错了,并解释一下我的错误,所以我明白了。 (JS和节点新手)

此致 洁

使用此处的模块: 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)
         })
      })        
    })

1 个答案:

答案 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函数,直到解析完最后一个文件。