如何使节点同步执行

时间:2014-10-09 23:17:15

标签: javascript node.js synchronous

我使用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();

我对节点很陌生,所以请原谅我的无知,但据我所知,节点很难异步,我认为这是我的问题。我猜测脚本在读取并完全解析该文件之前继续声明变量。我得到的错误是&#34;无法读取属性&#39; 1&#39;未定义&#34;引用行var orderNumber = parsedText[1][0];。所以我的想法是当脚本试图执行时parsedText正在被定义var orderNumber = parsedText[1][0];

我对正在发生的事情的理解是否正确?是否有任何解决方法可以强制脚本等到某些功能完成后再继续?我确定它不是太复杂,我想我在这里有点过头了,而且我没有运气搞清楚。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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等库,这将使您能够进行同步行为。但我想你首先必须意识到Pyramid Of Doom是什么!