Как я могу обещать однократное использование 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 не принимает обратный вызов. Как я мог справиться с этим? Спасибо за вашу помощь, я новичок в глотке.


person Bryce Johnson    schedule 18.04.2015    source источник


Ответы (2)


Все в 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 (флаг --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);
  });
};
person Dan    schedule 18.04.2015
comment
Ах! Да! Должен был это понять! Благодарю вас! - person Bryce Johnson; 18.04.2015
comment
Кроме того, я понятия не имел о поддержке промисов ES6 в Node. Это безумие/круто. - person Bryce Johnson; 18.04.2015

Поскольку задача 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;
};
person William Gaul    schedule 18.04.2015