如何使节点同步执行

How to make node execute synchronously

本文关键字:执行 同步 节点 何使      更新时间:2023-09-26

我使用node读取一个文件,然后根据该文件中的一些信息编译一个pdf。我想做什么就做什么,所以我认为细节没有那么重要。当我手动逐行输入它时,它正是我需要它做的,但当我试图让node作为javascript文件执行整个过程时,它会抛出错误,说我有未定义的变量。这是我的脚本:

    var PDFDocument = require('pdfkit');
    var hummus = require('hummus')
    var fs = require('fs');
    var parse = require('csv-parse');

    var tabDelimitedText = fs.readFileSync('/volumes/merge central/fip automation/working/tab-delimited.txt',{encoding:"UTF-8"})
    var parsedText;
    parse(tabDelimitedText , {delimiter:"'t"}, function(err, output){parsedText = output});

    //get client info from parsed text
    var orderNumber = parsedText[1][0];
    var clientName = parsedText[1][1];
    var coverText = "FIP_" + orderNumber + " " + clientName;
    var finishedPDFName = '/volumes/merge central/fip automation/~~~orders/FIP_' + orderNumber + "." + clientName + ".pdf"
    var qtyColumn = 2;
    var fileNameColumn = 3;

    //this section is making the coverpage with pdfkit
    var pageOptions = {size:[432,450]};
    doc = new PDFDocument(pageOptions);
    doc.pipe(fs.createWriteStream(finishedPDFName));
    doc.font('Helvetica-Bold').fontSize(25).text(coverText,0,200,{align:"center",width:432});
    doc.end();

    //opens the working pdf to be modified by hummus
    var pdfWriter = hummus.createWriterToModify(finishedPDFName)
    //this section appends files onto coverpage based on the tab delimited file
    for (thisRow = 1; thisRow < parsedText.length; thisRow++) {
        //gets data from parsed text file
        var thisQty = parsedText[thisRow][qtyColumn];
        var thisTrueQty = thisQty/6
        var thisFileName = "FIP_" + parsedText[thisRow][fileNameColumn];
        var thisPDFtoInsert = "/Volumes/MERGE CENTRAL/FIP AUTOMATION/Found Image Press Calendars/" + thisFileName;
        for (i = 0; i < thisTrueQty; i++) {
            pdfWriter.appendPDFPagesFromPDF(thisPDFtoInsert);
        }
    }
    //closes pdf
    pdfWriter.end();

我对node还很陌生,所以请原谅我的无知,但据我所知,node非常努力地实现异步,我认为这是我的问题。我猜测,在完全读取和解析该文件之前,脚本会继续声明变量。我得到的错误是引用行var orderNumber = parsedText[1][0];的"无法读取未定义的属性'1'"。所以我的想法是,当脚本试图执行var orderNumber = parsedText[1][0]; 时,parsedText正在被定义

我对正在发生的事情的理解正确吗?是否有任何变通方法可以强制脚本等待某些功能完成后再继续?我相信这并不太复杂,我想我只是有点不知所措,我没有运气弄清楚。如有任何帮助,我们将不胜感激。

欢迎使用堆栈溢出

首先,没有必要为自己是一个新手开脱,我们都去过那里,你似乎在发布问题之前已经做了研究。努力学习新事物值得称赞!

您认为Node是异步的是正确的,在这种情况下,它意味着一些事情:

你应该把所有的东西都放在:

parse(tabDelimitedText , {delimiter:"'t"}, function(err, output){
parsedText = output
//all the rest here
});

然后您会发现pdfWriter.end将在for循环完成其工作之前执行。在这种情况下,您可以在最后一次迭代后,通过在循环中调用.end()来解决此问题:

//this section appends files onto coverpage based on the tab delimited file
for (thisRow = 1; thisRow < parsedText.length; thisRow++) {
    //gets data from parsed text file
    var thisQty = parsedText[thisRow][qtyColumn];
    //if (thisQty != "") {
        var thisTrueQty = thisQty/6
        var thisFileName = "FIP_" + parsedText[thisRow][fileNameColumn];
        var thisPDFtoInsert = "/Volumes/MERGE CENTRAL/FIP AUTOMATION/Found Image Press Calendars/" + thisFileName;
        //inserts the pdf thisQty times
        for (i = 0; i < thisTrueQty; i++) {
            pdfWriter.appendPDFPagesFromPDF(thisPDFtoInsert);
            if(i==thisTrueQty-1){
                //closes pdf
                pdfWriter.end();
            }
        }
    //}
}

避免回调内部有回调的一种方法是使用像Q或async这样的库,这将使您能够进行同步行为。但我想你首先必须意识到什么是末日金字塔!