Асинхронная функция с exec ruby - PullRequest
0 голосов
/ 07 мая 2018

привет, у меня ошибка при запуске этой асинхронной функции, эта асинхронная функция вызывает файл 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 голосов
/ 07 мая 2018

Если вы хотите использовать функцию async, вы должны преобразовать ваши обратные вызовы в Обещание и await, что Обещание, чтобы получить желаемое значение. Обратите внимание, что нет необходимости переназначать (или использовать) внешнюю переменную 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...