Подтвердить что ты не робот

Как мы можем получить доступ к переменной из функции обратного вызова в 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 = ?

Как я могу найти имя пользователя вне функции exec?

4b9b3361

Ответ 1

Вы можете передать функции exec функции обратного вызова. Когда функция exec определяет имя пользователя, вы вызываете обратный вызов с именем пользователя.

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


Из-за асинхронного характера JavaScript вы не можете сделать что-то вроде этого:

    var username;

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

    child();

    console.log( username );

Это связано с тем, что строка console.log( username ); не будет ждать завершения вышеописанной функции.


Объяснение обратных вызовов:

    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.

Ответ 2

Вы можете написать оператор "exec" в функции, которая имеет обратный вызов... Как этот

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

или вы можете попробовать его в Интернете http://www.node-console.com/script/returning-username