我正在尝试使用来自firestore数据库的数据将tex文件编译为PFD。完成后,脚本不会终止。我发现可以使用process.exit()来退出。但是,它会终止仍然占用tex文件的子进程。所以,我需要一个异步函数。我发现如何制作它们的指南并没有特别帮助我。我仍然是javascript的新手,任何膨胀对我来说仍然非常混乱。
我发现如何制作它们的指南并没有特别帮助我。我仍然是javascript的新手,任何膨胀对我来说仍然非常混乱。在async
下面提到了下面提到的makePDF函数,用await
函数的调用不起作用,据我所知,已经过时了。我尝试实现一个promise,但不明白他们的语法是如何工作的。简单地将.then()附加到for循环中的函数调用就足以使循环等待函数完成了吗?如何使这个特定的异步?它已经在其体内使用异步函数是否重要?我理解,承诺用于将生产者生产的东西归还给消费者。现在,我的制作人不会产生任何要返回的东西。这有关系吗?
我的函数从for循环中调用:
function makePDF(object){
let input = fs.readFileSync('main.tex', 'utf8');
const outNameTex = object.ID + '.tex';
const outNamePDF = object.ID + '.pdf';
makeTEX(object, input, outNameTex);
const infile = fs.createReadStream(outNameTex);
const outfile = fs.createWriteStream(outNamePDF);
const pdf = latex(infile);
pdf.pipe(outfile);
pdf.on('error', err => console.error(err));
pdf.on('finish', () => {console.log('PDF generated!')});
}
我的循环功能:
firebase.auth().onAuthStateChanged((user) => {
if (user) {
console.log('user');
db.collection('objects').where('printed', '==', false).get().then((snapshot) => {
snapshot.forEach((doc) => {
console.table(doc.data());
makePDF(doc.data());
})
process.exit();
})
.catch((err) => {
console.log('Error getting documents', err);
});
} else {
console.log('no user');
}
});
它为每个文档输出一个表,但没有PDF generated.
async / await可能很难与for循环一起使用,这是因为异步函数返回一个promise ...如果你将async / await语法转换为native promise语法,你可能会发现问题所在。
你想要做的是使用Array.map
将每个doc映射/转换为一旦makePDF完成后解析的promise,然后使用Promise.all
等待所有的promise来解决..
解决方案看起来应该是这样的
function makePDF(object){
return new Promise((resolve, reject) => {
let input = fs.readFileSync('main.tex', 'utf8');
const outNameTex = object.ID + '.tex';
const outNamePDF = object.ID + '.pdf';
makeTEX(object, input, outNameTex);
const infile = fs.createReadStream(outNameTex);
const outfile = fs.createWriteStream(outNamePDF);
const pdf = latex(infile);
pdf.pipe(outfile);
pdf.on('error', reject);
pdf.on('finish', () => {console.log('PDF generated!'); resolve();});
}
firebase.auth().onAuthStateChanged((user) => {
if (user) {
console.log('user');
db.collection('objects').where('printed', '==', false).get().then((snapshot) => {
const promiseArr = snapshot.docs.map((doc) => {
console.table(doc.data());
return makePDF(doc.data());
})
Promise.all(promiseArr)
.then(() => {
process.exit();
})
})
.catch((err) => {
console.log('Error getting documents', err);
});
} else {
console.log('no user');
}
});