我怎么能保证在我的应用程序中一次性使用吞咽?

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

问题是,因为它是asynchronous的,所以我想使用一个承诺,在吞吐任务完成时会提醒我。

像这样的东西将是理想的:

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不会callback。 我怎么处理这个? 感谢您的帮助,我有点新的吞噬。

所有的东西都是stream,所以你可以只听enderror事件。

 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; 我build议蓝鸟作为替代。

另外值得一提的是,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); }); }; 

由于Gulp任务是一个stream,你可以监听它的事件:

 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; };