Javascript 如何使节点同步执行

Javascript 如何使节点同步执行,javascript,node.js,synchronous,Javascript,Node.js,Synchronous,我使用node读取一个文件,然后根据该文件中的一些信息编译一个pdf。我想做什么就做什么,所以我觉得细节没那么重要。当我手动逐行输入它时,它正是我需要它做的,但是当我试图让node以javascript文件的形式执行整个过程时,它会抛出错误,说我有未定义的变量。这是我的剧本: var PDFDocument = require('pdfkit'); var hummus = require('hummus') var fs = require('fs'); var

我使用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();
var PDFDocument=require('pdfkit');
var hummus=需要(“hummus”)
var fs=需要('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”},函数(err,output){parsedText=output});
//从解析的文本中获取客户端信息
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;
//本节使用pdfkit制作封面
var pageOptions={size:[432450]};
doc=新PDF文档(页面选项);
文档管道(fs.createWriteStream(finishedPDFName));
doc.font('Helvetica-Bold').fontSize(25).text(coverText,0200,{align:“center”,width:432});
doc.end();
//打开要由hummus修改的工作pdf
var pdfWriter=hummus.createWriterToModify(finishedPDDFName)
//本节根据制表符分隔的文件将文件追加到封面
for(thisRow=1;thisRow
我对node还很陌生,所以请原谅我的无知,但是,据我所知,node非常努力地实现异步,我认为这是我的问题。我猜脚本会在文件被完全读取和解析之前声明变量。我得到的错误表示“无法读取未定义的属性“1”,引用行
var orderNumber=parsedText[1][0]。因此,我的想法是,当脚本尝试执行
var orderNumber=parsedText[1][0]时,
parsedText
正在被定义


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

欢迎使用堆栈溢出

首先,没有必要为自己是一个新手而辩解,我们都去过那里,而你似乎在发布问题之前已经做了调查。努力学习新事物的荣誉

关于节点是异步的,您是对的,在本例中,这意味着以下几点:

您应该将所有内容都放在:

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();
            }
        }
    //}
}
//本节根据制表符分隔的文件将文件追加到封面上
for(thisRow=1;thisRow

避免在回调中包含回调的一种方法是使用Q或async之类的库,这将使您能够进行同步行为。但我想你首先要明白什么是a

非常感谢你的回复,我很感激。你建议的方法似乎和我想要的一样有效。谢谢你的帮助!