带有 exec ruby 的异步函数

Asynchronous function with exec ruby

嗨我在运行这个异步函数上有一个错误,这个异步函数调用了ruby文件!我应该设置代码让异步函数等待exec和base64.encode的终止,我该怎么做?

async function GenerazioneRapportino() {
  var encode="false";

  console.log("Model: sono dentor model");
  //Cambio direttorio
  process.chdir('./Model');
  // console.log("directory:",process.cwd());
  exec('ruby report.rb prova prova2 prova3', function (err, stdout, stderr) {
    if(stderr) {  
      console.log("Errore generazione rapportino: ",err);  
      return encode;  
    } else {
      console.log("File Generator Correttamente: ",stdout);
      base64.encode('rapportino.pdf', function(err, base64String) {
        encode=base64String;             
        process.chdir('../');
        console.log("Process dir ",process.cwd());
        return encode;
      });
    }

  });

  console.log("Model: Ritorno encode");
  return encode;
}

如果您想使用 async 函数,您应该将回调转换为 Promise,然后 await 该 Promise 以获得所需的值。请注意,无需重新分配(或使用)外部 encode 变量:

async function GenerazioneRapportino() {
  console.log("Model: sono dentor model");
  process.chdir('./Model');
  const result = await new Promise((resolve, reject) => {
    exec('ruby report.rb prova prova2 prova3', function(err, stdout, stderr) {
      if (stderr) {
        console.log("Errore generazione rapportino: ", err);
        reject(false);
      } else {
        console.log("File Generator Correttamente: ", stdout);
        base64.encode('rapportino.pdf', function(err, base64String) {
          process.chdir('../');
          console.log("Process dir ", process.cwd());
          resolve(base64String);
        });
      }
    });
  });
  console.log("Model: Ritorno encode");
  return result;
}

请注意,如果承诺被拒绝,在 async 函数中使用 await 将导致抛出错误 - 确保 GenerazioneRapportino 的消费者调用 [=] 中的函数17=]块。