Заставить Javascript (узел) ждать на exec - PullRequest
2 голосов
/ 16 июня 2019

Я хочу, чтобы мой основной процесс ожидал некоторого вывода из 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

1 Ответ

3 голосов
/ 16 июня 2019

Вы можете обещать 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.

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