0

首先,我为我糟糕的英语道歉:D

您好,我有以下情况让我很感兴趣,我有一个在 react 中制作的前端和一个在 node 中通过 express 接收请求的后端。这个想法是,我从前端使用 POST 方法发送一个 pdf 文件,后端处理这个文件,进行必要的处理(将页面分成更多文件并在 pdf 中获取数据),最后它返回这些处理过的 pdf . 我想在 POST 响应中返回这些新文件,但我遇到了异步问题。处理文件时,我使用 pfd2Json 库,这个库显然异步处理您选择的 pdf 并让执行流程继续,我的问题是当我发送库来处理我的 pdf 时,它把它放在“后台” “处决仍在继续,

当一个 post 请求到达时,程序执行这个函数“ getPDF()

async function getPdf(fileLocation) {
    let pdf = fileLocation;

    await pdfSeparator(pdf, folderTemp);

    await getInformationsPdf();
    return arrayObj
}

当它执行getInformationsPdf()时,程序执行所有内容,但不等待库处理 pdf。在这种情况下,我将每个单独的文件加载到一个 forEach 中,使用pdfParser.loadPDF(fileLocation); 上传我的pdf,他正在等待pdfParser.on(“pdfParser_dataReady”,pdfData => {})读取所有内容只是因为这个方法是异步的,它只是调用它并将其置于后台,使流程一直持续到块的末尾并转到下一个 forEach 项目,而 pdf 甚至还没有被处理。最后,所有的 forEach 都已经执行并且 pdf 还没有被处理,程序发送响应并且来自 pdf 的数据在后端。有没有办法让我在发送回复之前强制等待治疗?

async function getInformationsPdf() {
    let arrayObjs = []
    fs.readdirSync(folderTemp).forEach(file => {
        var pdfParser = new PDFParser(this, 1);
        let fileLocation = folderTemp + file;
        pdfParser.loadPDF(fileLocation);
        
        pdfParser.on("pdfParser_dataError", (errData) => {
            console.error(errData.parserError)
        });

        pdfParser.on("pdfParser_dataReady", (pdfData) => {
            let t1 = pdfData.formImage.Pages[0].Texts[32].R[0].T.replace(/%20/g, " ");
            let t2 = pdfData.formImage.Pages[0].Texts[33].R[0].T.replace(/%20/g, " ");
            let t3 = pdfData.formImage.Pages[0].Texts[34].R[0].T.replace(/%20/g, " ");
            let t4 = pdfData.formImage.Pages[0].Texts[35].R[0].T.replace(/%20/g, " ");
            let t5 = pdfData.formImage.Pages[0].Texts[36].R[0].T.replace(/%20/g, " ");
            let t6 = pdfData.formImage.Pages[0].Texts[37].R[0].T.replace(/%20/g, " ");
            let t7 = pdfData.formImage.Pages[0].Texts[38].R[0].T.replace(/%20/g, " ");
            let t8 = pdfData.formImage.Pages[0].Texts[39].R[0].T.replace(/%20/g, " ");
            let t9 = pdfData.formImage.Pages[0].Texts[40].R[0].T.replace(/%20/g, " ");
            let textsPdf = [t1, t2, t3, t4, t5, t6, t7, t8, t9];
            let fileWithTexts = {
                file: fileLocation,
                texts: textsPdf
            }

            renameFileMatch(fileWithTexts);
            arrayObjs.push(fileWithTexts);
        });
    })
    return arrayObjs;
}
4

2 回答 2

1

如果我正确理解了这个问题,getInformationsPdf()则为该文件夹中的每个文件执行一个循环,并且在继续之前它不会等待内部的处理pdfParser.on("pdfParser_dataReady"完成,所以在这段代码中:

    let pdf = fileLocation;

    await pdfSeparator(pdf, folderTemp);

    await getInformationsPdf();
    return arrayObj

return arrayObj在 pdf 实际完成处理之前运行,对吗?

所以我认为你应该使用的模式是用 制作一个 Promises 数组fs.readdirSync(folderTemp).map,然后在pdfParser.on("pdfParser_dataReady". 然后,你可以await Promise.all()所有的承诺

它可能看起来像这样:

async function getInformationsPdf() {
    let arrayObjs = []
    const promises = fs.readdirSync(folderTemp).map(file => {
        return new Promise((resolve, reject) => {
            var pdfParser = new PDFParser(this, 1);
            let fileLocation = folderTemp + file;
            pdfParser.loadPDF(fileLocation);

            pdfParser.on("pdfParser_dataError", (errData) => {
                console.error(errData.parserError);
                reject(errData);
            });

            pdfParser.on("pdfParser_dataReady", (pdfData) => {
                let t1 = pdfData.formImage.Pages[0].Texts[32].R[0].T.replace(/%20/g, " ");
                let t2 = pdfData.formImage.Pages[0].Texts[33].R[0].T.replace(/%20/g, " ");
                let t3 = pdfData.formImage.Pages[0].Texts[34].R[0].T.replace(/%20/g, " ");
                let t4 = pdfData.formImage.Pages[0].Texts[35].R[0].T.replace(/%20/g, " ");
                let t5 = pdfData.formImage.Pages[0].Texts[36].R[0].T.replace(/%20/g, " ");
                let t6 = pdfData.formImage.Pages[0].Texts[37].R[0].T.replace(/%20/g, " ");
                let t7 = pdfData.formImage.Pages[0].Texts[38].R[0].T.replace(/%20/g, " ");
                let t8 = pdfData.formImage.Pages[0].Texts[39].R[0].T.replace(/%20/g, " ");
                let t9 = pdfData.formImage.Pages[0].Texts[40].R[0].T.replace(/%20/g, " ");
                let textsPdf = [t1, t2, t3, t4, t5, t6, t7, t8, t9];
                let fileWithTexts = {
                    file: fileLocation,
                    texts: textsPdf
                }

                renameFileMatch(fileWithTexts);
                arrayObjs.push(fileWithTexts);
                resolve(fileWithTexts);
            });
        })        
    });
    await Promise.all(promises);
    return arrayObjs;
}
于 2020-09-29T15:46:50.187 回答
0

你可以在你的getInformationsPdf()函数中使用 Promise

例子

function getInformationsPdf() {
       return new Promise((resolve, reject) => {
           let arrayObjs = [];
           fs.readdirSync(folderTemp).forEach(file => {
                  ...//your code stuff
                if(!fileWithTexts) resolve(arrayObjs);  //handle your exception
                renameFileMatch(fileWithTexts);
                arrayObjs.push(fileWithTexts);
                
           })
     })
}
于 2020-09-29T15:50:34.267 回答