2016-12-08 1 views
1

J'aime intégrer exec de nodejs dans une fonction personnalisée pour gérer toutes les erreurs dans cette fonction.nodejs attente d'exec dans la fonction

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(); 

Cette fonction renvoie undefined car exec n'est pas terminé lorsque la valeur est retournée. Comment puis-je résoudre ce problème? Puis-je forcer la fonction à attendre exec?

Répondre

4

Depuis la commande est exécutée de manière asynchrone, vous voulez utiliser un callback pour gérer la valeur de retour une fois que la commande a terminé son exécution:

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, c'est ce que je cherchais – RGe

0

exec traitera avec elle de façon asynchrone, de sorte que vous devrait recevoir un rappel ou retourner une promesse.

Une chose que vous pouvez faire pour le rendre synchronisation est d'utiliser execSync à la place:

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

La méthode child_process.execSync() est généralement identique à child_process.exec () à l'exception que la méthode ne retournera pas jusqu'à ce que le processus fils soit complètement fermé. Lorsqu'un délai d'attente a été rencontré et que killSignal est envoyé, la méthode ne retournera pas tant que le processus n'aura pas été complètement fermé. Notez que si le processus enfant intercepte et gère le signal SIGTERM et ne quitte pas, le processus parent attendra la fin du processus enfant.

0

vous pouvez utiliser comme promesse:

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

Vous pouvez le faire avec rappel. Peut-être que vous pouvez essayer quelque chose comme ceci:

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... 
}