Как я могу обещать - использовать одноразовое использование 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;
};