Javascript NodeJS Html pdf:fs.readfilesync如何异步/等待
我的html pdf文档创建有问题。问题是,代码通常运行速度很快,以完成pdf文档创建过程。这些过程包括通过替换HTML文件中的占位符来构建HTML字符串。下面您可以看到随后发生的代码Javascript NodeJS Html pdf:fs.readfilesync如何异步/等待,javascript,node.js,express,mongoose,html-pdf,Javascript,Node.js,Express,Mongoose,Html Pdf,我的html pdf文档创建有问题。问题是,代码通常运行速度很快,以完成pdf文档创建过程。这些过程包括通过替换HTML文件中的占位符来构建HTML字符串。下面您可以看到随后发生的代码 Object.keys(setter).forEach(function(element, key, _array) { var regex = new RegExp(element, "g");
Object.keys(setter).forEach(function(element, key, _array) {
var regex = new RegExp(element, "g");
data = data.replace(regex, setter[element])
})
var result = data;
fs.writeFile(mergeFileRes, result, 'utf8', function (err) {
if(err) {
console.log(err);
return;
} else {
let html2 = fs.readFileSync(mergeFileRes, 'utf8');
let options = {
format: 'a4' ,
"directory" : "/tmp",
};
if(html2){
pdf.create(html2, options).toStream(function(err, stream2){
if(err) console.log(err);
stream2.pipe(res);
stream2.on('end', function () {
try{
fs.unlink(mergeFileRes)
console.log(3090, "deleted file");
}
catch (err){
console.log(3090, "Did not delete file");
}
});
});
} else {
}
}
});
我的问题是,在许多情况下,在pdf.create进程开始之前,html2变量尚未创建。这可能是因为readFileSync需要花费太长时间才能完成
我在想,我怎样才能解决这个问题。如何使pdf.create等待readFileSync完成并填充html2变量。您可以使用
fs.readFile
异步读取文件,并且html2
将在回调函数中可用
Object.keys(setter).forEach(function(element, key, _array) {
var regex = new RegExp(element, "g");
data = data.replace(regex, setter[element])
})
var result = data;
fs.writeFile(mergeFileRes, result, 'utf8', function (err) {
if(err) {
console.log(err);
return;
} else {
fs.readFile(mergeFileRes, 'utf8', function(err, html2){
if (err) throw err;
let options = {
format: 'a4' ,
"directory" : "/tmp",
};
pdf.create(html2, options).toStream(function(err, stream2){
if(err) console.log(err);
stream2.pipe(res);
stream2.on('end', function () {
try{
fs.unlink(mergeFileRes)
console.log(3090, "deleted file");
}
catch (err){
console.log(3090, "Did not delete file");
}
});
});
});
}
});
readFileSync是一个同步调用,除非读取未完成,否则将无法继续。控制台在读取数据后读取数据。这可能是因为readFileSync需要很长时间才能完成-不,没有,正如名称所示,该函数是同步的。问题在别处,因此object.keys/data.replace函数可能花费的时间太长?我想你可能是对的。但是,我怎么能强迫代码等待这个过程完成呢?谢谢你的回答。代码运行正常,但仍然会不时出现此错误:GET/api/bill/pdf/5c52eba76369863df45f5712 200 2043.263 ms--assert.js:42抛出新错误。AssertionError({^AssertionError[ERR_ASSERTION]:html pdf:如果没有html字符串,则无法创建pdf。如果我告诉代码等待,怎么可能仍然没有html字符串?您的工作假设是
Object.keys(setter).forEach()在执行剩余代码之前已经完成了数据更新。但唯一可以保证的是,每个元素都调用回调。在等待之前,您不等待回调完成。您可能需要考虑使用“代码>誓言< /代码>系列,并且当最终承诺完成时,执行Co。这应该随之而来。