EnChikiben
@EnChikiben

Как сделать асинхронное выполнение в gulp?

Добрый день! Необходимо запустить и дождаться выполнения задачи с bootprint, но он не работает с pipe как это сделать подскажите?
У меня вот такая таска:
function generateDocsHtml() {
    return function (cb) {
        let bootprintService =
            bootprint
                .load(bootprint_swagger)
                .merge({
                    handlebars : {
                        partials : path.join(__dirname, partials),
                        templates : path.join(__dirname, templates),
                        helpers : path.join(__dirname, helpers),
                        data : {
                            items : items
                        }
                    },
                    less : {
                        main : [
                            path.join(__dirname, less + '/theme.less'),
                            path.join(__dirname, less + '/vars.less')
                        ]
                    }
                });

        return glob(build + '/**/*.json', function (err, files) {
            const items = [];
            for (let pathFile of files) {
                let fileName = pathFile.substring(pathFile.lastIndexOf('/') + 1);
                const savePath = path.join(__dirname, build);
                let name = fileName.split('.')[0].toLowerCase();
                items.push({
                    name : name,
                    fileName : fileName,
                });
            }

            items.forEach((item) => {
                const savePath = path.join(__dirname, build);
                bootprintService
                    .build(path.join(__dirname, build + '/' + item.name + '/' + item.name + '.json'), savePath + '/' + item.name)
                    .generate()
                    .done();
            });
        });
    }
}

суть в том что файлов конфигов json может быть много мне надо их все обойти и для каждого сгенерировать html, и только после этого сказать гульпу что таска выполнена, как то можно это сделать? или сделать по другому
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега Gulp.js
frontend developer
Что еще за return glob() ?

Все очень просто — в done вызывайте коллбэк завершения таска

Как-то так

bootprintService
 …
 .done(function(){ cb() });


Однако, учитывая, что эта хрень вызывается в цикле, следйет каждый вызов обернуть в промис, в done резолвить промис,

let services = [];
items.forEach((item) => {
  services.push(new Promise((resolve, reject)=>{
    bootprintService
    ...
    .done(() => resolve());
  }))
});


а коллбэк вызывать в конце, после разрешения всех промисов

Promise.all(services)
.then(function(){  cb() })
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы