Как я могу обещать - использовать одноразовое использование gulp в моем приложении?
Как часть небольшой программы, которую я пишу, я хотел бы использовать gulp для преобразования большого набора файлов в уценку. Это не является частью этапа сборки отдельно от программы. Это часть программы. Поэтому я не использую gulpfile для этого.
Проблема в том, что, поскольку она асинхронна, я хочу использовать обещание, которое предупредит меня, когда задача gulp будет завершена.
Что-то вроде этого было бы идеальным:
io.convertSrc = function() {
var def = q.defer();
gulp.src(src + '/*.md')
.pipe(marked({}))
.pipe(gulp.dest(dist), function() {
def.resolve('We are done!');
});
return def.promise;
}
Но pipe
не выполняет обратный вызов. Как я могу справиться с этим? Спасибо за вашу помощь, я немного новичок в gulp.
Ответы
Ответ 1
Все в gulp - это поток, поэтому вы можете просто слушать события end
и error
.
io.convertSrc = function() {
var def = q.defer();
gulp.src(src + '/*.md')
.pipe(marked({}))
.pipe(gulp.dest(dist))
.on('end', function() {
def.resolve();
})
.on('error', def.reject);
return def.promise;
}
В стороне, Q 1.0 больше не разрабатывается (кроме нескольких исправлений здесь и там) и будет полностью несовместимым с Q 2.0; Я бы рекомендовал Bluebird в качестве альтернативы.
Также стоит упомянуть, что NodeJS 0.12 имеет встроенный ES6 promises (необязательный флаг --harmony
), поэтому, если вы не ищете обратную совместимость, вы можете просто использовать их вместо этого.
io.convertSrc = function() {
return new Promise(function(resolve, reject) {
gulp.src(src + '/*.md')
.pipe(marked({}))
.pipe(gulp.dest(dist))
.on('end', resolve)
.on('error', reject);
});
};
Ответ 2
Поскольку задача Gulp является потоком, вы можете прослушивать ее события:
io.convertSrc = function() {
var def = q.defer();
var stream = gulp.src(src + '/*.md')
.pipe(marked({}))
.pipe(gulp.dest(dist));
stream.on('end', function() {
def.resolve();
});
stream.on('error', function(err) {
def.reject(err);
});
return def.promise;
};