Gulp поток внутри цикла for не работает должным образом

У меня есть задача gulp, похожая на следующую. Я пытаюсь выполнить цикл и добавить строку на страницу, а также объединить соответствующий файл.

gulp.task('loop', function() {

    for(i =0; i < 10; i++) {

        gulp.src('./build/ross/templates/pages/_page_home.liquid')
            .pipe(plugins.insert.append('Loop ' + i))
            // real example has concat here
            .pipe(plugins.addSrc('./src/page/_page' + i + '.liquid'))
            .pipe(plugins.concat('_page_home.liquid'))
            .pipe(gulp.dest('./build/ross/templates/pages/'));

    }

});

Ожидаемый результат будет примерно таким

Loop 1
// _page1.liquid contents
Loop 2
// _page2.liquid contents
Loop 3
// _page3.liquid contents
and so on...

Фактический результат больше похож на

// Original Page Contents here
Loop 9
// _page9.liquid contents

Я сделал fs.readFile для исходного файла в цикле и вывел данные, и он выводит только исходное содержимое страницы, а не объединенный файл или строку, которую я пытаюсь добавить.

Я также сделал console.log(i) внутри, и он показывает правильные цифры 1,2,3,4,5,6,7,8,9. Интересно, имеет ли это какое-то отношение к gulp.src()?

Обновление: иногда кажется, что содержимое вывода на самом деле будет содержать части содержимого _page#.liquid. Это немного непоследовательно.

Есть ли лучший способ сделать это с помощью gulp или я просто делаю что-то не так?


person Ross    schedule 05.05.2015    source источник
comment
возможный дубликат закрытия JavaScript внутри циклов - простой практический пример   -  person hereandnow78    schedule 05.05.2015
comment
Если я console.log(i) выведет 0,1,2,3,4,5,6,7,8,9 и т.д...   -  person Ross    schedule 05.05.2015
comment
внутри ваших глотков вы асинхронны! сам ваш цикл НЕ является асинхронным. поместите материал в свой цикл внутри функции и вызовите его из своего цикла (с i в качестве аргумента), и вы увидите, что это сработает!   -  person hereandnow78    schedule 05.05.2015
comment
Я все еще получаю те же проблемы, как я могу сказать одному потоку закончить, прежде чем делать что-либо еще?   -  person Ross    schedule 06.05.2015
comment
Заработало с помощью stream-to-promise и bluebird -- см. gist.github.com/rdallaire/e84a796a09e2aa189534   -  person Ross    schedule 06.05.2015
comment
теперь я получил то, что вы хотели достичь. хороший обходной путь...   -  person hereandnow78    schedule 06.05.2015
comment
Спасибо здесь и сейчас78!   -  person Ross    schedule 06.05.2015


Ответы (1)


Получил работу с помощью людей из #gulpjs на freenode irc.

Здесь используются stream-to-promise и bluebird

var s2p = require('stream-to-promise');
var Promise = require('bluebird');

gulp.task('loop2', function() {
    // don't forget your `var`s!
    var buildIt = function(i){
        return gulp.src('./build/ross/templates/pages/_page_home.liquid')
            .pipe(plugins.insert.append('Loop ' + i))
            .pipe(gulp.dest('./build/ross/templates/pages/'))
            .on('end', function(){ console.log(i + ' -- done')});
    }

    var indexes = [];

    for(var i = 0; i < 10; i++) {
        indexes.push(i);
    }

    // // sequence them
    indexes.reduce(function(p, index){
        return p.then(function(){
            return s2p(buildIt(index));
        });
    }, Promise.resolve());

});
person Ross    schedule 06.05.2015