Gulp - вызвать обработчик обратного вызова только для последней итерации
Я пытаюсь обработать несколько файлов в gulp с плагином jsValidate.
Я сделал небольшую оболочку для функции задачи, чтобы запускать ее с / без ошибки там, где она мне нужна. В конце задачи я хочу вызвать callback с помощью моей обертки, но только один раз (насколько я понимаю, gulp.src обрабатывает каждый "виниловый" файл в отдельном / новом потоке и вызывает "done". Если я запускаю "done" для первый файл, затем gulp просто завершит задачу, я полагаю, и не обработает остальные.)
Пара комментариев к коду:
используя плагин gulp-src-files, чтобы получить количество всех файлов
"./Temp/*.js" - все файлы. Просто пустые заглушки / файлы, чтобы сохранить глоток
currentFileIndex - индекс текущего файла
gulp-jsvalidate - плагин, который проверяет файлы. Просто чтобы показать какой-то процесс, где мне нужно использовать errorHandling.
via2 - для создания функции, где я делаю if / else и выполняю триггер
ОБНОВЛЕНИЕ Я создал две отдельные задачи (одна с помощником, другая - прямой вызов для done() callback) для простоты.
- Выполнено задание обрабатывает все файлы
- Задача помощника обрабатывает 16 файлов и "умирает"
Вот код:
var gulp = require("gulp"),
through2 = require("through2"),
jsValidate = require("gulp-jsvalidate"),
getFiles = require("gulp-src-files"),
files = getFiles("./Temp/*.js");
var errorHelper = (function() {
function getSuccessHandler(done) {
return function() {
console.log("SUCCESS!!!");
done();
};
}
function getErrorHandler(done) {
return function(error) {
console.log("ERROR!!!");
done(new Error(error));
};
}
return {
wrap: function(taskFunc) {
return function(done) {
var stream = taskFunc(getSuccessHandler(done), getErrorHandler(done));
if (stream && typeof stream.on === "function") {
stream.on("end", getSuccessHandler(done));
}
}
}
}
})();
var taskFn1 = function(successHandler, errorHandler) {
var currentFileIndex = 1;
console.log("Length: " + files.length);
return gulp.src(files)
.pipe(jsValidate())
.on("error", errorHandler)
.pipe(through2.obj(function(file, enc, cb) {
console.log("Current: " + currentFileIndex);
if (currentFileIndex === files.length) {
console.log("successHandler triggered");
successHandler();
}
currentFileIndex++;
cb(null, file);
}));
};
var taskFn2 = function(done) {
var currentFileIndex = 1;
console.log("Length: " + files.length);
return gulp.src(files)
.pipe(jsValidate())
.on("error",
function(error) {
console.log("Error!!!");
done(new Error("error triggered"));
}
)
.pipe(through2.obj(function(file, enc, cb) {
console.log("Current: " + currentFileIndex);
if (currentFileIndex === files.length) {
console.log("successHandler triggered");
done();
}
currentFileIndex++;
cb(null, file);
}));
};
gulp.task("Helper", errorHelper.wrap(taskFn1));
gulp.task("Done", taskFn2);
Пример вывода консоли для 17 файлов для задачи Helper:
[20:17:10] Starting 'Helper'...
Length: 17
Current: 1
Current: 2
Current: 3
Current: 4
Current: 5
Current: 6
Current: 7
Current: 8
Current: 9
Current: 10
Current: 11
Current: 12
Current: 13
Current: 14
Current: 15
Current: 16
[20:17:10] The following tasks did not complete: Test
[20:17:10] Did you forget to signal async completion?
Process terminated with code 1.
Почему это происходит? Кто-нибудь может объяснить?) Заранее спасибо!