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
Функция по существу блокирует до завершения.