Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Node.js - Recursive Walker (https://javascript.ru/forum/project/28773-node-js-recursive-walker.html)

DreamTheater 02.06.2012 20:02

На самом деле уже есть похожее решение. Просто мне захотелось попробовать самому :)

B~Vladi 04.06.2012 21:13

Цитата:

Сообщение от Gvozd
По-моему должно быть очевидно, что любая библиотека для Node.Js должна быть обязательно ассинхронной(там где нужно и возможно, разумеется), и лишь только во вторую очередь, в ней возможно может быть синхронный вариант для всех ее асинхронных функций.

Странное утверждение. Если говорить про либу от ТС - да, здесь в первую очередь должен быть асинхронный вариант. Асинхронность нужна там, где нода обращается к внешним ресурсам (база, файловая система), включая всякие обертки вокруг этого (как Recursive Walker), и при чистых тяжелых вычислениях (числа фибоначчи).
Если вычисления выполняются до 3-5 мс: добавлять асинхронность нет смысла.

Gvozd 04.06.2012 21:45

Оговорка в скобках написана невидимыми буквами?

B~Vladi 04.06.2012 21:52

Ога ^^

Kolyaj 05.06.2012 10:45

Цитата:

Сообщение от DreamTheater
Только что написал асинхронный аналог. Время полной отработки внутри каталога C:\Windows ~22 секунды.

Исходники покажите.

DreamTheater 05.06.2012 12:07

Цитата:

Сообщение от Kolyaj (Сообщение 179066)
Исходники покажите.

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) {
        var root = path.resolve(from),

            callback = function (error, tree) {
                if (error !== null) {
                    return this.emit('error', error);
                }

                tree.forEach(function (leaf) {
                    var branch = path.join(root, leaf),

                        callback = function (error, stats) {
                            if (error !== null) {
                                return this.emit('error', error);
                            }

                            if (stats.isFile()) {
                                this.emit('file', branch);
                            } else if (stats.isDirectory()) {
                                this.walk(branch);
                            }
                        }.bind(this);

                    fs.stat(branch, callback);
                }, this);
            }.bind(this);

        this.emit('directory', root);

        fs.readdir(root, callback);

        return this;
    };

    return Walker;
}());

Kolyaj 05.06.2012 12:10

А как вы время выполнения вычислили, если у вас окончание перебора нигде не фиксируется?

DreamTheater 05.06.2012 12:32

Так, на часах засек :D

Kolyaj 05.06.2012 12:42

Сделайте для тренировки событие end. Код значительно усложнится.

DreamTheater 05.06.2012 12:43

Цитата:

Сообщение от Kolyaj (Сообщение 179100)
Сделайте для тренировки событие end. Код значительно усложнится.

Да-да, именно поэтому я пока его не выкладываю. Хочу сделать более красиво все.


Часовой пояс GMT +3, время: 01:58.