我想让我的主进程等待执行程序的一些输出。
我想强制程序按顺序执行这些步骤,等待每个步骤然后再进入下一步。我觉得这应该很容易,但我不知道该怎么做。
对于其他语言,默认情况下会等待,例如在 Perl 中,以下 5 行将完全满足我的要求。
print("START")
print(`sleep 3; echo 1`)
print(`sleep 2; echo 2`)
print(`sleep 1; echo 3`)
print("END")
Run Code Online (Sandbox Code Playgroud)
如何在 Node 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")
Run Code Online (Sandbox Code Playgroud)
这是代码的输出:
$ node make_it_wait.js
START
END
3
2
1
Run Code Online (Sandbox Code Playgroud)
您可以承诺exec并等待,直到每个命令完成:
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"))
Run Code Online (Sandbox Code Playgroud)
正如另一个答案中指出的,还有 exec 的同步变体execSync。如果您所做的是脚本或另一个一次性程序,您可能会发现它更容易使用。在服务器/多进程环境中,最好使用 async/await。