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.

Почему это происходит? Кто-нибудь может объяснить?) Заранее спасибо!

0 ответов

Другие вопросы по тегам