强制Javascript(节点)等待exec

强制Javascript(节点)等待exec,javascript,exec,Javascript,Exec,我想让我的主进程等待exec的一些输出 我想强制程序按顺序执行这些步骤,在进入下一步之前等待每一步。我觉得这应该很容易,但我不知道怎么做 对于其他语言,它默认为等待,例如,在Perl中,下面的5行将完全满足我的要求 print("START") print(`sleep 3; echo 1`) print(`sleep 2; echo 2`) print(`sleep 1; echo 3`) print("END") 如何在节点JavaScript中实现这一点 这是到目前为止我的代码 cons

我想让我的主进程等待exec的一些输出

我想强制程序按顺序执行这些步骤,在进入下一步之前等待每一步。我觉得这应该很容易,但我不知道怎么做

对于其他语言,它默认为等待,例如,在Perl中,下面的5行将完全满足我的要求

print("START")
print(`sleep 3; echo 1`)
print(`sleep 2; echo 2`)
print(`sleep 1; echo 3`)
print("END")
如何在节点JavaScript中实现这一点

这是到目前为止我的代码

const util = require('util');
const exec = require('child_process').exec;

function sleepy1() {
  exec("sleep 3; echo 1", function( stderr, stdout ) {
    console.log( stdout.trim() )
  })
}

function sleepy2() {
  exec("sleep 2; echo 2", function( stderr, stdout ) {
    console.log( stdout.trim() )
  })
}

function sleepy3() {
  exec("sleep 1; echo 3", function( stderr, stdout ) {
    console.log( stdout.trim() )
  })
}

console.log("START")
sleepy1()
sleepy2()
sleepy3()
console.log("END")
以下是代码的输出:

$ node make_it_wait.js 
START
END
3
2
1

您可以提示执行并等待每个命令完成:

const util = require('util');
const exec = require('child_process').exec;

const execa = util.promisify(exec);

function sleepy1() {
  return execa("sleep 3; echo 1")
}

function sleepy2() {
  return execa("sleep 2; echo 2")
}

function sleepy3() {
  return execa("sleep 1; echo 3")
}

async function main() {
    console.log((await sleepy1()).stdout)
    console.log((await sleepy2()).stdout)
    console.log((await sleepy3()).stdout)
}


console.log("START");
main().then(() => console.log("END"))
正如在另一个答案中指出的,还有exec的sync变体,
execSync
。如果您所做的是一个脚本或另一个一次性程序,您可能会发现它更易于使用。在服务器/多进程环境中,最好使用async/await。

这是一个问题,请在提问之前搜索StackOverflow。