我正在尝试使用来自Firestore数据库的数据将tex文件编译为PFD。完成后,脚本不会终止。我发现可以使用process.exit()使其退出。但是,它会终止仍然限制tex文件的子进程。因此,我需要一个异步函数。 我找到的有关如何制作它们的指南对我没有特别帮助。我对javascript还是很陌生,对我而言,任何膨胀都还是很困惑。
我发现的制作方法的指南并没有特别帮助我。我对javascript还是很陌生,任何膨胀对我来说仍然很困惑。
以下前面提到的带有async
的makePDF函数和带有await
的函数调用不起作用,并且据我所知,已经过时了。
我尝试实现一个Promise,但不了解其语法如何工作。在for循环中简单地将.then()添加到函数调用中是否足以使循环等待函数完成?
如何使这种特定的异步?
它已经在体内使用异步函数有关系吗?
我知道,诺言用于将生产者生产的产品返还给消费者。现在,我的生产者什么也没有退还。这有关系吗?
我的函数从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.
答案 0 :(得分:0)
将async / await与for循环一起使用可能会比较棘手,这是因为async函数会返回一个promise ...如果将async / await语法转换为本机promise语法,您可能会发现问题所在。
您要执行的操作是使用 def post(self, request):
author = User.objects.get(id=request.data.get('user_id'))
new_article = Article.objects.create(author=author, title=request.data.get('title'),
text=request.data.get('text'),img=File(request.data.get('image[0]')))
new_article.save()
for i in range(20):
img_key = 'image[{}]'.format(i)
img = request.data.get(img_key)
if img:
article_img = ArticleImage(article=new_article,img=File(img), is_main=False )
article_img.save()
else :
break
images = ArticleImage.objects.filter(article=new_article)
return Response({
'article': ArticleSerializer(new_article, context=self.get_serializer_context()).data
})
将每个文档映射/转换为Promake完成后即可解决的Promise,然后使用Array.map
等待所有Promise都解决。 / p>
解决方案应该看起来像这样
Promise.all
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();});
}