Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.06.2012, 01:51
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 02.06.2012, 02:56
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от DreamTheater
Работает полностью синхронно, то есть никаких заморочек с коллбэками.
Сообщение от DreamTheater
Node.js
Не замечаете явной нестыковки?
По-моему должно быть очевидно, что любая библиотека для Node.Js должна быть обязательно ассинхронной(там где нужно и возможно, разумеется), и лишь только во вторую очередь, в ней возможно может быть синхронный вариант для всех ее асинхронных функций.
Или я чего-то не понимаю в Node.js?
Ответить с цитированием
  #3 (permalink)  
Старый 02.06.2012, 02:58
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от DreamTheater
то есть никаких заморочек с коллбэками.
я увидел в вашем примере "Как использовать:" целых три колбека
Что я делаю не так?
Ответить с цитированием
  #4 (permalink)  
Старый 02.06.2012, 03:19
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Gvozd, Вы безусловно правы. Я не имею богатого опыта написания приложений на Node.js, поэтому могу не знать кое-каких аспектов. Я читал что основная фишка Node.js это именно асинхронность, но она же и становится камнем преткновения во многих задачах, когда "коллбэк на коллбэке и коллбэком погоняет". Даже на одной конференции, еще когда на уровне ядра Node.js не было синхронной реализации многих методов, один из докладчиков "жаловался" на это обстоятельство.

Что до моих трех коллбэков, то это скорее слушатели. Я же имел ввиду что не стоит придумывать некий велосипед чтобы словить нужный момент времени.
Ответить с цитированием
  #5 (permalink)  
Старый 02.06.2012, 04:12
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от DreamTheater
но она же и становится камнем преткновения во многих задачах, когда "коллбэк на коллбэке и коллбэком погоняет"
я где-то слышал фразу о том, что многопоточность во всей ее красе и полноте(с разделением общих ресурсов, и разрешением гонок) хорошо понимают лишь 5% разработчиков.
с асинхронностью похожая ситуация, ИМХО.

Но, мне кажется более правильным будет все-таки реализация библиотеки в рамках реалий языка(то есть асинхронной), чтобы с ее помощью можно было написать хорошее приложение, и лишь только после этого можно добавить синхронный режим, чтобы его можно было использовать в тех задачах, где допустима синхронность на этой операции, и в тех проектах, где разработчики не могут мыслить асинхронно.
Ответить с цитированием
  #6 (permalink)  
Старый 02.06.2012, 04:16
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Сообщение от Gvozd Посмотреть сообщение
Но, мне кажется более правильным будет все-таки реализация библиотеки в рамках реалий языка(то есть асинхронной), чтобы с ее помощью можно было написать хорошее приложение, и лишь только после этого можно добавить синхронный режим, чтобы его можно было использовать в тех задачах, где допустима синхронность на этой операции, и в тех проектах, где разработчики не могут мыслить асинхронно.
Ну, именно для таких комментариев я и создал данный топик. В дискуссиях рождается истина
Ответить с цитированием
  #7 (permalink)  
Старый 02.06.2012, 19:11
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Только что написал асинхронный аналог. Время полной отработки внутри каталога C:\Windows ~22 секунды. То же самое но с синхронной реализацией выше - ~1,5 секунды.

Целесообразность использовать асинхронность для меня под сильным вопросом.

Последний раз редактировалось DreamTheater, 02.06.2012 в 19:19.
Ответить с цитированием
  #8 (permalink)  
Старый 02.06.2012, 19:22
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от DreamTheater
синхронной реализацией выше - 1,5 секунды.
В эти 1.5 секунды не будет выполнятся никакой другой запрос
Сообщение от DreamTheater
~22 секунды.
За эти 22 секунды параллельно могут быть обработаы сотни-тысячи других запросов
Ответить с цитированием
  #9 (permalink)  
Старый 02.06.2012, 19:39
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Сообщение от Gvozd Посмотреть сообщение
В эти 1.5 секунды не будет выполнятся никакой другой запрос

За эти 22 секунды параллельно могут быть обработаы сотни-тысячи других запросов
В случае веб-сервера да, но в случае консольной тулзы это не нужно.
Ответить с цитированием
  #10 (permalink)  
Старый 02.06.2012, 19:57
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от DreamTheater
В случае веб-сервера да, но в случае консольной тулзы это не нужно.
Node.js это все-таки в первую очередь веб-сервер же.
И поэтому в первую очередь должен быть асинхронный вариант, и лишь потом для таких применений как консольная утилита, можно сделать синхронный вариант.
Раз вы реализовали и синхронный и асинхронные варианты, то можно распространять библиотеку с обоими вариантами же, и любой, кому нужна такая библиотека будет доволен тем, что нашел нужный вариант
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Javascript-разработчик (ExtJS, node.js), 50 000 - 80 000, СПб IrinaS Работа 0 03.04.2012 20:40
PHP + Node.JS Diego Серверные языки и технологии 4 19.02.2012 22:17
Node.js Kolyaj Серверные языки и технологии 49 24.05.2010 22:29
node.js передача параметров серверу ,пример Kilowatt Серверные языки и технологии 1 12.04.2010 19:18