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

问题描述 投票:0回答:1

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

javascript asynchronous promise
1个回答
0
投票

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');
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.