如何以异步方式编写?

问题描述 投票:0回答:2
var pdfParser = require('pdf-parser')
var fs = require('fs')
var PDF_PATH = __dirname + '/pdfs'
var results = []
var failed = []

fs.readdir(PDF_PATH, function(err, files){
    if(err){
        return console.log(err)
    }
    for(const file of files){
        let the_ent = {
            'name': '',
            'other data': []
        }

        pdfParser.pdf2json(PDF_PATH + '/' + file, function(error, pdf){
            if(error != null){
                console.log(error)
            }else if(pdf['pages'] == undefined){
                failed.push(file)
                console.log(file +' failed')
            }else{
                //populate 'results' array
            }
                console.log(/*pdf_data*/)
                results.push(/*pdf_data*/)

        })
    }
    console.log(results)
    console.log(failed)
    results = JSON.stringify(results)
    //fs.writeFileSync() write results to json
})

我不知道今天早上我怎么了,我不知道如何异步编写它;显然,脚本执行后立即触发底部的日志/写文件。

我已经尝试包装异步函数并等待readdir / pdf解析而不是使用回调-显然不正确。我只是想解析文件夹中的每个pdf-将我想要的内容推送到一些数组,然后在循环完成zzz后将它们记录下来。

javascript node.js asynchronous callback
2个回答
0
投票

包装最小的异步tasks into Promises,然后使用async / await组合它们:

   // the Promise wrapper:
   const parsePdf = file => new Promise((res, rej) => pdfParser.pdf2json(file, (err, r) => err ? rej(err) : res(r));

 (async function () { // start an asynchronous context
   const PDF_PATH = __dirname + '/pdfs'; 
   const results = [], failed = []; // prefer const over let

    // reading files in a promising way is already provided natively:
   const files = await fs.promises.readdir(PDF_PATH);

   for(const file of files){ // this is in series, in parallel would probably be faster
     let the_ent = {
         name: '',
         'other data': [], // avoid whitespaces!
     };

     const pdf = await parsePdf(PDF_PATH + '/' +file);

     if(pdf.pages === undefined) { // prefer equality (===) over comparison (==)
        failed.push(file);
        console.log(file + ' failed');
     } else {
        // populate 'results' array
     }             
  }

  console.log(results, failed);
})();

您可能也可以处理文件in parallel


0
投票

您可以使用util.promisify来实现同步功能:

const readdir = util.promisify(fs.readdir);
const reader = util.promisify(pdfParser.pdf2json);

最小演示:

const fs = require('fs');
const util = require('util');
var pdfParser = require('pdf-parser');

const readdir = util.promisify(fs.readdir);
const reader = util.promisify(pdfParser.pdf2json);

var PDF_PATH = __dirname + '/pdfs';

(async () => {
    async function processFiles() {
        let results = [];

        let files = await readdir(PDF_PATH);

        for (const file of files) {
            let pdf = await reader(PDF_PATH + '/' + file);
            results.push(pdf);
        }

        return results;
    }

    const result = await processFiles();

    console.info(result);
})();
© www.soinside.com 2019 - 2024. All rights reserved.