02.06.2012, 01:51
|
|
Профессор
|
|
Регистрация: 15.02.2011
Сообщений: 471
|
|
Node.js - Recursive Walker
Что делает:
Рекурсивно проходит от указанного корня и эмитирует события о всех найденных файлах и директориях.
Исходный код:
// Walker.js
var EventEmitter = require('events').EventEmitter,
fs = require('fs'),
path = require('path'),
util = require('util');
module.exports = (function () {
function Walker() {
EventEmitter.call(this);
}
util.inherits(Walker, EventEmitter);
Walker.prototype.walk = function (from) {
try {
var root = path.resolve(from),
tree = fs.readdirSync(root);
this.emit('directory', root);
tree.forEach(function (leaf) {
var branch = path.join(root, leaf),
stats = fs.statSync(branch);
if (stats.isFile()) {
this.emit('file', branch);
} else {
this.walk(branch);
}
}, this);
} catch (error) {
this.emit('error', error);
}
return this;
};
return Walker;
}());
Как использовать:
// sandbox.js
var Walker = require('./Walker');
(function () {
var walker = new Walker();
walker.on('file', function (file) {
console.log('file:', file);
});
walker.on('directory', function (directory) {
console.log('directory:', directory);
});
walker.on('error', function (error) {
console.log('error:', error);
});
walker.walk('C:\Windows');
}());
Что получится:
Код:
|
directory: C:\Windows
directory: C:\Windows\AppCompat
error: { [Error: EPERM, operation not permitted 'C:\Windows\AppCompat\Programs']
errno: 50,
code: 'EPERM',
path: 'C:\\Windows\\AppCompat\\Programs',
syscall: 'readdir' }
directory: C:\Windows\AppPatch
file: C:\Windows\AppPatch\AcGenral.dll
file: C:\Windows\AppPatch\AcLayers.dll
... |
Работает полностью синхронно, то есть никаких заморочек с коллбэками.
Прошу кидать помидорами.
Последний раз редактировалось DreamTheater, 02.06.2012 в 01:57.
|
|
02.06.2012, 02:56
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от DreamTheater
|
Работает полностью синхронно, то есть никаких заморочек с коллбэками.
|
Сообщение от DreamTheater
|
Node.js
|
Не замечаете явной нестыковки?
По-моему должно быть очевидно, что любая библиотека для Node.Js должна быть обязательно ассинхронной(там где нужно и возможно, разумеется), и лишь только во вторую очередь, в ней возможно может быть синхронный вариант для всех ее асинхронных функций.
Или я чего-то не понимаю в Node.js?
|
|
02.06.2012, 02:58
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от DreamTheater
|
то есть никаких заморочек с коллбэками.
|
я увидел в вашем примере "Как использовать:" целых три колбека
Что я делаю не так?
|
|
02.06.2012, 03:19
|
|
Профессор
|
|
Регистрация: 15.02.2011
Сообщений: 471
|
|
Gvozd, Вы безусловно правы. Я не имею богатого опыта написания приложений на Node.js, поэтому могу не знать кое-каких аспектов. Я читал что основная фишка Node.js это именно асинхронность, но она же и становится камнем преткновения во многих задачах, когда "коллбэк на коллбэке и коллбэком погоняет". Даже на одной конференции, еще когда на уровне ядра Node.js не было синхронной реализации многих методов, один из докладчиков "жаловался" на это обстоятельство.
Что до моих трех коллбэков, то это скорее слушатели. Я же имел ввиду что не стоит придумывать некий велосипед чтобы словить нужный момент времени.
|
|
02.06.2012, 04:12
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от DreamTheater
|
но она же и становится камнем преткновения во многих задачах, когда "коллбэк на коллбэке и коллбэком погоняет"
|
я где-то слышал фразу о том, что многопоточность во всей ее красе и полноте(с разделением общих ресурсов, и разрешением гонок) хорошо понимают лишь 5% разработчиков.
с асинхронностью похожая ситуация, ИМХО.
Но, мне кажется более правильным будет все-таки реализация библиотеки в рамках реалий языка(то есть асинхронной), чтобы с ее помощью можно было написать хорошее приложение, и лишь только после этого можно добавить синхронный режим, чтобы его можно было использовать в тех задачах, где допустима синхронность на этой операции, и в тех проектах, где разработчики не могут мыслить асинхронно.
|
|
02.06.2012, 04:16
|
|
Профессор
|
|
Регистрация: 15.02.2011
Сообщений: 471
|
|
Сообщение от Gvozd
|
Но, мне кажется более правильным будет все-таки реализация библиотеки в рамках реалий языка(то есть асинхронной), чтобы с ее помощью можно было написать хорошее приложение, и лишь только после этого можно добавить синхронный режим, чтобы его можно было использовать в тех задачах, где допустима синхронность на этой операции, и в тех проектах, где разработчики не могут мыслить асинхронно.
|
Ну, именно для таких комментариев я и создал данный топик. В дискуссиях рождается истина
|
|
02.06.2012, 19:11
|
|
Профессор
|
|
Регистрация: 15.02.2011
Сообщений: 471
|
|
Только что написал асинхронный аналог. Время полной отработки внутри каталога C:\Windows ~22 секунды. То же самое но с синхронной реализацией выше - ~1,5 секунды.
Целесообразность использовать асинхронность для меня под сильным вопросом.
Последний раз редактировалось DreamTheater, 02.06.2012 в 19:19.
|
|
02.06.2012, 19:22
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от DreamTheater
|
синхронной реализацией выше - 1,5 секунды.
|
В эти 1.5 секунды не будет выполнятся никакой другой запрос
Сообщение от DreamTheater
|
~22 секунды.
|
За эти 22 секунды параллельно могут быть обработаы сотни-тысячи других запросов
|
|
02.06.2012, 19:39
|
|
Профессор
|
|
Регистрация: 15.02.2011
Сообщений: 471
|
|
Сообщение от Gvozd
|
В эти 1.5 секунды не будет выполнятся никакой другой запрос
За эти 22 секунды параллельно могут быть обработаы сотни-тысячи других запросов
|
В случае веб-сервера да, но в случае консольной тулзы это не нужно.
|
|
02.06.2012, 19:57
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от DreamTheater
|
В случае веб-сервера да, но в случае консольной тулзы это не нужно.
|
Node.js это все-таки в первую очередь веб-сервер же.
И поэтому в первую очередь должен быть асинхронный вариант, и лишь потом для таких применений как консольная утилита, можно сделать синхронный вариант.
Раз вы реализовали и синхронный и асинхронные варианты, то можно распространять библиотеку с обоими вариантами же, и любой, кому нужна такая библиотека будет доволен тем, что нашел нужный вариант
|
|
|
|