繁体   English   中英

如何使节点同步执行

[英]How to make node execute synchronously

我正在使用node读取文件,然后根据该文件中的某些信息来编译pdf。 我已经完成了我想做的所有事情,所以我认为细节并不那么重要。 当我手动逐行输入它时,它的功能完全符合我的要求,但是当我尝试让节点将所有内容作为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]; 所以我的想法是,当脚本尝试执行var orderNumber = parsedText[1][0];时, parsedText正在定义中var orderNumber = parsedText[1][0];

我对所发生的事情的理解正确吗? 是否有任何变通办法可以迫使脚本等待某些功能完成才能继续? 我敢肯定它并不太复杂,我想我只是在这里有点不知所措,而且我没有运气来弄清楚它。 任何帮助,将不胜感激。

欢迎使用Stack Overflow!

首先,没有必要为成为新手而辩解,我们都去过那里,并且您似乎已经完成了研究,然后再发布问题。 感谢您尝试学习新事物!

您对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之类的库,这些库使您能够进行同步行为。 但是我想您首先必须意识到什么是《厄运金字塔》

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM