我如何承诺 - 如果在我的申请中一次性使用gulp?

Bry*_*son 12 javascript node.js q gulp

作为我正在编写的小程序的一部分,我想使用gulp将大量文件转换为markdown.这不是与程序分开的构建步骤的一部分.这是该计划的一部分.所以我没有使用gulpfile来处理这个问题.

问题是,因为它是异步的,我想使用一个在gulp任务完成时会提醒我的promise.

这样的事情是理想的:

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;
}
Run Code Online (Sandbox Code Playgroud)

但是pipe不接受回调.我怎么能处理这个?谢谢你的帮助,我有点新意.

Dan*_*try 16

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;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,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);
  });
};
Run Code Online (Sandbox Code Playgroud)