【问题标题】:Force Javascript (node) to wait on exec强制 Javascript(节点)等待 exec
【发布时间】:2019-06-16 16:01:21
【问题描述】:

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

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

对于其他语言,它是默认等待的,例如在 Perl 中,以下 5 行将完全符合我的要求。

print("START")
print(`sleep 3; echo 1`)
print(`sleep 2; echo 2`)
print(`sleep 1; echo 3`)
print("END")

如何在 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")

这是代码的输出:

$ node make_it_wait.js 
START
END
3
2
1

【问题讨论】:

  • 这是Duplicate,请在提问前搜索 StackOverflow。

标签: javascript exec


【解决方案1】:

您可以承诺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"))

正如另一个答案中所指出的,还有 exec 的同步变体 execSync。如果您所做的是脚本或其他一次性程序,您可能会发现它更易于使用。在服务器/多进程环境中,最好使用 async/await。

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 2019-12-10
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多