定义异步函数并在forEach循环中使用它

时间:2019-04-16 13:44:53

标签: javascript asynchronous promise

我正在尝试使用来自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.

1 个答案:

答案 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();});
}