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

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

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

3
RGe 8 Дек 2016 в 13:23

4 ответа

Лучший ответ

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

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
});
9
Hyddan 8 Дек 2016 в 10:31

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

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

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

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

1
yokomizor 8 Дек 2016 в 10:32

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

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);
})
4
Sourbh Gupta 8 Дек 2016 в 10:41

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

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...
}
0
Dejan Dimčić 8 Дек 2016 в 11:31