与exec ruby​​的异步函数

时间:2018-05-07 07:02:36

标签: javascript ruby asynchronous exec

嗨我在运行这个异步函数时遇到错误,这个异步函数会调用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;
}

1 个答案:

答案 0 :(得分:0)

如果你想使用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;
}

请注意,如果承诺被拒绝,在await函数中使用async将导致错误抛出 - 确保GenerazioneRapportino的使用者在try中调用该函数阻止。