nodejs在函数中等待exec

时间:2016-12-08 10:23:05

标签: javascript node.js function exec

我喜欢在自定义函数中集成nodejs中的exec来处理这一函数中的所有错误。

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 个答案:

答案 0 :(得分:7)

由于命令是异步执行的,因此一旦命令执行完毕,您将需要使用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
});

答案 1 :(得分:2)

你可以使用promise作为:

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

答案 2 :(得分:1)

exec 将以异步方式处理它,因此您应该收到回调或返回一个承诺。

为了使其同步,您可以做的一件事是使用 execSync

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

  

child_process.execSync()方法通常与   child_process.exec(),但方法不会   返回直到子进程完全关闭。超时时   遇到并且发送了killSignal,该方法不会返回直到   这个过程已经完全退出。注意,如果子进程   截取并处理SIGTERM信号并且不退出父节点   进程将等待子进程退出。

答案 3 :(得分:0)

你可以通过回调来做到这一点。也许你可以尝试这样的事情:

public int example (int tall1, int tall2, int tall3, int tall4) {

    int lowest = Math.min(tall1,tall2);
    int lowest1 = Math.min(tall3, tall4);
    int lowest2 = Math.min(lowest,lowest1);

    return lowest2;
}