Node.js и Джейк - Как синхронно вызывать системные команды внутри задачи?

Задача Джейка выполняет длительную системную команду. Другая задача зависит от того, как первая задача была полностью завершена перед началом. Функция exec функции child_process выполняет системные команды асинхронно, что позволяет запустить вторую задачу до ее завершения.

Какой самый чистый способ написать Jakefile, чтобы гарантировать, что длительная системная команда в первой задаче завершится до запуска второй задачи?

Я думал об использовании опроса в фиктивном цикле в конце первой задачи, но это просто пахнет плохо. Кажется, должен быть лучший путь. Я видел этот ТАК вопрос, но он не совсем отвечает на мой вопрос.

var exec = require('child_process').exec;

desc('first task');
task('first', [], function(params) {
  exec('long running system command');
});

desc('second task');
task('second', ['first'], function(params) {
  // do something dependent on the completion of 'first' task
});

2 ответа

Решение

Я нашел ответ на свой вопрос, перечитав статью Мэтью Эрниссе. Для тех, кто интересуется, как это сделать:

var exec = require('child_process').exec;

desc('first task');
task('first', [], function(params) {
  exec('long running system command', function() {
    complete();
  });
}, true); // this prevents task from exiting until complete() is called

desc('second task');
task('second', ['first'], function(params) {
  // do something dependent on the completion of 'first' task
});

Просто для дальнейшего использования у меня есть синхронный модуль exec без каких-либо других зависимостей.

Пример:

var allsync = require("allsync");
allsync.exec( "find /", function(data){
    process.stdout.write(data);
});
console.log("Done!");

В приведенном выше примере, Done печатается только после find процесс существует. exec Функция по существу блокирует до завершения.

Другие вопросы по тегам