web-dev-qa-db-fra.com

Comment pouvons-nous accéder à la variable à partir de la fonction de rappel dans node.js?

var sys = require('sys');
var exec = require('child_process').exec;
var cmd = 'whoami';
var child = exec( cmd,
      function (error, stdout, stderr) 
      {
        var username=stdout.replace('\r\n','');
      }
);

var username = ?

Comment puis-je trouver un nom d'utilisateur en dehors de la fonction exec?

28
Devang Bhagdev

Vous pouvez passer la fonction exec un rappel. Lorsque la fonction exec détermine le nom d'utilisateur, vous appelez le rappel avec le nom d'utilisateur.

    var child = exec(cmd, function(error, stdout, stderr, callback) {
        var username = stdout.replace('\r\n','');
        callback( username );
    });


En raison de la nature asynchrone de JavaScript, vous ne pouvez pas faire quelque chose comme ceci:

    var username;

    var child = exec(cmd, function(error, stdout, stderr, callback) {
        username = stdout.replace('\r\n','');
    });

    child();

    console.log( username );

En effet, la ligne console.log( username ); n'attendra pas que la fonction ci-dessus soit terminée.


Explication des rappels:

    var getUserName = function( callback ) {            
        // get the username somehow
        var username = "Foo";    
        callback( username );
    };

    var saveUserInDatabase = function( username ) {
        console.log("User: " + username + " is saved successfully.")
    };

    getUserName( saveUserInDatabase ); // User: Foo is saved successfully.
30
Matthias Holdorf

Vous pouvez écrire l'instruction "exec" dans une fonction qui a un rappel ... Comme ceci

var sys = require('sys');
var exec = require('child_process').exec;
var cmd = 'whoami';
function execChild(callback){
    var child = exec( cmd,
          function (error, stdout, stderr) 
          {
            username=stdout.replace('\r\n','');
             callback(username);
          }
 )};
    execChild(function(username){
    console.log(username);
});
4
Sahil Chitkara