如何使节点同步执行
How to make node execute synchronously
我使用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这样的库,这将使您能够进行同步行为。但我想你首先必须意识到什么是末日金字塔!
- ajax调用获胜't同步执行
- JavaScript 函数同步执行
- 在表单同步提交后执行 js 吗?
- 使用AngularJS,如何在视图和控制器同步特定更改后触发代码执行
- 是否有一种方法可以在节点中同步执行多个JavaScript文件
- 如何使用$q promise同步执行FOR LOOP
- 如何执行“;“同步”;javascript调用服务器而不锁定浏览器
- DOM渲染是否保证在单个(同步)函数期间阻止'执行
- javascript中同步函数执行中的问题
- 如何确保包含多个$.ajax调用的函数完全同步运行,并允许在执行时重新绘制浏览器
- jQuery Deferred和Promise用于同步和异步函数的顺序执行
- 执行 ajax 同步 POST 然后提交表单的正确方法
- 同步 JavaScript 调用节点 js- 执行 GET in for 循环
- 嵌套承诺执行不同步
- 如何在Chrome App中执行同步XMLHttpRequest
- 同步 jquery 调用 - 如何等到 jquery 方法执行竞争
- Node.js for 循环,带有回调,之后同步执行
- 将函数的执行同步为 node.js 中的回调参数
- 是使java脚本执行同步更好或使用setTimeout来修复一些东西
- 在执行同步ajax请求之前,在单击按钮时显示等待光标