Обновление
После того, как вы отредактировали свой вопрос, чтобы показать действительный код, это должно работать:
var ps = require('child_process');
var fs = require('fs');
var _ = require("underscore");
function listDirectory(dir, callback) {
fs.readdir(dir, function (error, folders) {
// simply keep track on how many of the ls's have finished
var count = folders.length, done = 0;
_(folders).each(function (folder, folderKey, folderList) {
ps.exec("ls ./" + folder, function(error, stdout, stderr) {
console.log('one more done');
done++;
if (done === count) {
callback();
}
});
});
})
}
listDirectory('./', function() {
console.log('all done!');
});
При запуске:
one more done
one more done
one more done
one more done
one more done
one more done
one more done
one more done
one more done
one more done
one more done
one more done
all done!
Старый ответ
Я полагаю, вы используете модуль child_process
.
Вам необходимо создать оболочку для ваших команд.
var spawn = require('child_process').spawn;
// this function will execute all the things in the cmds array
// after all the processes have exited, it will call the callback
function multiSpawn(cmds, callback) {
var count = cmds.length;
var done = 0;
for(var i = 0; i < count; i++) {
// spawn the process, modify this if you need to hook up further events
// you could also pass in further functions to setup each spawn
var ps = spawn(cmds[i].shift(), cmds[i]);
ps.on('exit', function() {
done++; // keep track on how many commands have finished
if (done === count) {
callback();
}
});
}
}
multiSpawn([
['ls', '/usr/lib', '-l'],
['sleep', '1'], // this will sleep 1 seconds
['ls', '/usr/share', '-a']
], function() {
console.log('all done');
});
Это запустит все 3 команды, две ls
завершатся мгновенно, sleep
задержит все на 1
секунду, после этого будет вызван обратный вызов.
Я думаю, это также возможнос Futures , но это, скорее всего, перебор в этой ситуации.