2016-12-08 2 views
1

Мне нравится интегрировать exec из nodejs в пользовательскую функцию для обработки всех ошибок в этой одной функции.nodejs wait for exec in function

const exec = require('child_process').exec; 

function os_func() { 
    this.execCommand = function(cmd) { 
     var ret; 
     exec(cmd, (error, stdout, stderr) => { 
      if (error) { 
       console.error(`exec error: ${error}`); 
       return; 
      } 
      ret = stdout; 
     }); 
     return ret; 
    } 
} 
var os = new os_func(); 

Эта функция возвращает undefined, поскольку exec не завершается при возврате значения. Как я могу это решить? Могу ли я заставить функцию ждать exec?

ответ

4

Поскольку команда выполняется асинхронно вы хотите использовать callback обрабатывать возвращаемое значение после того, как команда завершит выполнение:

const exec = require('child_process').exec; 

function os_func() { 
    this.execCommand = function(cmd, callback) { 
     exec(cmd, (error, stdout, stderr) => { 
      if (error) { 
       console.error(`exec error: ${error}`); 
       return; 
      } 

      callback(stdout); 
     }); 
    } 
} 
var os = new os_func(); 

os.execCommand('SomeCommand', function (returnvalue) { 
    // Here you can get the return value 
}); 
+0

ty, это то, что я искал – RGe

0

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

Одна вещь, которую вы могли бы сделать для того, чтобы сделать его синхронизации является использование execSync вместо:

https://nodejs.org/api/child_process.html#child_process_child_process_execsync_command_options

child_process.execSync() метод, как правило, идентичны child_process.exec (), за исключением того, что метод не будет вернуться до полного закрытия дочернего процесса. Когда тайм-аут имеет и отправлен killSignal, метод не вернется до , процесс полностью завершен. Обратите внимание, что если дочерний процесс перехватывает и обрабатывает сигнал SIGTERM и не выходит из него, родительский процесс будет ожидать завершения дочернего процесса.

0

вы можете использовать обещание как:

const exec = require('child_process').exec; 

function os_func() { 
    this.execCommand = function (cmd) { 
     return new Promise((resolve, reject)=> { 
      exec(cmd, (error, stdout, stderr) => { 
      if (error) { 
       reject(error); 
       return; 
      } 
      resolve(stdout) 
      }); 
     }) 
    } 
} 
var os = new os_func(); 

os.execCommand('pwd').then(res=> { 
    console.log("os >>>", res); 
}).catch(err=> { 
    console.log("os >>>", err); 
}) 
0

Вы можете сделать это с обратным вызовом. Возможно, вы можете попробовать что-то вроде этого:

function os_func() { 
this.execCommand = function(cmd, myCallback) { 
    var ret; 
    exec(cmd, (error, stdout, stderr) => { 
     if (error) { 
      console.error(`exec error: ${error}`); 
      return; 
     } 
     ret = stdout; 
     myCallback(ret); 

    }); 
} 


function myCallback(ret){ 
     // TODO: your stuff with return value... 
}