Я начал играть с Node.js в последнее время, и я столкнулся с ситуацией, когда мне нужно небольшое руководство по предписывающему пути Node.js для выполнения задачи. В этом конкретном случае мне нужно создать группу каталогов, и, когда все каталоги были созданы, мне нужно выполнить некоторую окончательную операцию. Порядок, в котором создаются каталоги, не имеет значения, мне просто нужно выполнить окончательную операцию после последнего.
Самый простой способ добиться этого - вернуться к старым синхронным привычкам. То есть просто вызовите fs.mkdirSync
для каждого из каталогов и выполните операцию в конце. Например:
fs.mkdirSync('a', 0755);
fs.mkdirSync('a/b', 0755);
fs.mkdirSync('a/b/c', 0755);
performFinalOperation();
Пока это сработает, ему не кажется, что это способ Node.js. Очевидно, что программа блокируется, пока она ждет, когда ОС создаст каталог и вернется. В сильно загруженной системе с файловой системой, смонтированной удаленно, каждый из вызовов mkdirSync
может занять очень много времени. Таким образом, это не лучший подход.
Одним из основных пунктов продажи Node.js является тот факт, что он асинхронный. Таким образом, вызовы fs.mkdir
могут быть скованы через обратные вызовы:
fs.mkdir('a', 0755, function(e) {
if (!e) {
fs.mkdir('a/b', 0755, function(e) {
if (!e) {
fs.mkdir('a/b/c', 0755, function(e) {
if (!e) {
performFinalOperation();
}
});
}
});
}
});
Опять же, этот подход, я уверен, работает, но это приводит к действительно глубокому вложению и дублированию кода. У него есть преимущество не блокировать, пока каталоги создаются, но по какой цене?
Другой подход состоял бы в том, чтобы получить действительно фантазию, чтобы избежать дублирования кода и вложенности:
(function (directories) {
if (directories.length === 0) {
performFinalOperation();
} else {
var tail = arguments.callee;
fs.mkdir(directories.shift(), 0755, function(e) {
tail(directories);
});
}
})(['a', 'a/b', 'a/b/c']);
В этом подходе используются всевозможные сумасшедшие вещи: анонимные функции самопомощи и магические аргументы. Но хуже всего, не очевидно, что делает код на первый взгляд.
Итак, хотя конкретный вопрос заключается в создании каталогов, меня больше интересует подход, который прибегает опытный ветеран Node.js, когда возникает такая ситуация. Мне особенно неинтересно, какие библиотеки существуют, чтобы сделать это проще.