Я начинаю изучать и использовать узел, и он мне нравится, но я не совсем уверен, как работают определенные функции. Может быть, вы можете помочь мне решить одну такую проблему:
Я хочу создавать локальные скрипты и программы с моего сервера узлов по командам отдыха. Глядя на библиотеку fs, я увидел приведенный ниже пример того, как создать дочерний процесс и добавить к нему несколько обработчиков каналов/событий.
var spawn = require('child_process').spawn,
ps = spawn('ps', ['ax']),
grep = spawn('grep', ['ssh']);
ps.stdout.on('data', function (data) {
grep.stdin.write(data);
});
ps.stderr.on('data', function (data) {
console.log('ps stderr: ' + data);
});
ps.on('close', function (code) {
if (code !== 0) {
console.log('ps process exited with code ' + code);
}
grep.stdin.end();
});
grep.stdout.on('data', function (data) {
console.log('' + data);
});
grep.stderr.on('data', function (data) {
console.log('grep stderr: ' + data);
});
grep.on('close', function (code) {
if (code !== 0) {
console.log('grep process exited with code ' + code);
}
});
Что странно для меня, так это то, что я не понимаю, как я могу гарантировать, что код обработчика событий будет зарегистрирован до того, как программа начнет работать. Это не похоже на функцию «возобновление», которую вы запускаете, чтобы запустить ребенка. Разве это не состояние гонки? Конечно, условие будет крошечным и почти никогда не сработает, потому что это такой короткий фрагмент кода после этого, но все же, если это так, я бы предпочел не кодировать его таким образом из хороших привычек.
Итак: 1) если это не состояние гонки, то почему? 2) если это состояние гонки, как я могу написать это правильно?
Спасибо за ваше время!