Поток событий Node.js: где установить MaxListeners?

Я искал и искал это, безрезультатно. Я прочесал Интернет (включая Stackoverflow) и документы Node в поисках ответа и не нашел ни одного, который сработал (может быть, это просто плохой поиск с моей стороны). Я работаю с потоком событий в конфигурационном файле gulp, и у меня есть конкретная задача, связанная с классической ошибкой «обнаружена утечка памяти» из класса EventEmitter. Из того, что я нашел, ответ на решение этой проблемы, по-видимому, заключается в вызове метода setMaxListeners класса EventEmitter; и мое исследование показало, что поток событий имеет объект Stream, который должен быть экземпляром EventEmitter. Однако, каким бы способом я ни пытался вызвать setMaxListeners, я получаю, что метод не найден. Утомив себя исследованием проблемы, я решил передать ее гуру Node здесь (я предполагаю, что это просто, и я просто что-то упускаю). Вот мой код:

return eventStream.merge(
        gulp.src('./jscript/libs/file-one.js'),
        gulp.src('./jscript/libs/filder_one/file-two.js'),
        gulp.src('./jscript/libs/folder_two/file-three.js'),
        gulp.src('./jscript/libs/folder_three/file_four.js'),
        gulp.src('./jscript/libs/folder_four/file_five.js'),
        gulp.src('./jscript/libs/folder_five/file_six.js'), 
        gulp.src('./jscript/libs/file_seven.js'),
        gulp.src('./jscript/libs/file_eight.js'),
        gulp.src('./jscript/lists/rules/*.js')
    )        
    .pipe(concat('my_file.js'))
    .pipe(gulp.dest('./jscript/dist/'))
    .pipe(rename('my_file.min.js'))
    .pipe(uglify())
    .pipe(gulp.dest('./jscript/dist/'));

Спасибо!


person user2646829    schedule 11.02.2014    source источник


Ответы (2)


Это не прямой ответ на ваш вопрос, но вы можете передать массив шаблонов глобусов в gulp.src() вместо объединения нескольких gulp.src(). Разве это не решает вашу проблему?

https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulpsrcglobs-options

РЕДАКТИРОВАТЬ

В качестве прямого ответа у меня сработало следующее:

var merged = eventStream.merge(...);
merged.setMaxListeners(0);
return merged.pipe(...);

В то время как прослушиватели событий добавляются в функцию слияния, количество прослушивателей, кажется, проверяется между тиками цикла событий. Таким образом, мы можем установить MaxListeners сразу после добавления слушателей.

person Shuhei Kagawa    schedule 12.02.2014
comment
Спасибо! Это решило мою проблему; однако да, это было косвенно, и мне все еще очень любопытно, как на самом деле установить EventEmitter.setMaxListeners в потоке событий --- на случай, если мне это может понадобиться в некоторых других обстоятельствах (если кто-нибудь знает). - person user2646829; 12.02.2014
comment
Добавил прямой ответ. - person Shuhei Kagawa; 13.02.2014
comment
Ты жжешь! Спасибо еще раз! - person user2646829; 14.02.2014

В Node.js 0.12 (скоро будет выпущен) вы сможете установить максимум для всех эмиттеров:

var events = require('events');
events.EventEmitter.defaultMaxListeners = 100;

Подробнее читайте в соответствующем коммите.

person Sindre Sorhus    schedule 11.02.2014
comment
Очень полезно (буду с нетерпением ждать этого релиза). Спасибо. - person user2646829; 12.02.2014