考虑这两个吞咽任务:
gulp.task('src', function(done) {
gulp.src('docs/*')
.on('end', function() {
console.log('ending');
done();
});
});
gulp.task('dest', function(done) {
gulp.src('docs/*')
.pipe(gulp.dest('temp'))
.on('end', function() {
console.log('ending');
done();
});
});
运行gulp dest
的行为符合预期,输出:
[12:33:15] Using gulpfile ~/Projects/gulp-exit/gulpfile.js
[12:33:15] Starting 'dest'...
ending
[12:33:15] Finished 'dest' after 13 ms
但是,运行gulp src
仅输出:
[12:31:11] Using gulpfile gulpfile.js
[12:31:11] Starting 'src'...
从未调用'end'
回调。经过一点调试,我认为dest
任务中的流是正在流动,而源任务中的数据流不是。
通过调用stream.resume()
:显式地向src
任务发送流信号
gulp.task('src', function(done) {
gulp.src('docs/*')
.on('end', function() {
console.log('ending');
done();
})
.resume();
});
给出预期输出:
[12:46:52] Using gulpfile gulpfile.js
[12:46:52] Starting 'src'...
ending
[12:46:52] Finished 'src' after 11 ms
我在插件中看到过同样的混合行为:gull.dest和gull-mocha似乎返回了流动的流,而gull-logger和gull-gh页面则没有。
为什么行为上有差异?
之所以会发生这种情况,是因为有些流有要读取的数据,而有些流没有。
CCD_ 7返回具有CCD_ 8中的每个文件的数据的可读流。end
事件仅在从可读流中读取了所有数据之后才触发可读流。
通常情况下,你会将其传输到另一个流中,该流会自动执行此操作,但由于你不是,你需要使用:
gulp.task('src', function(done) {
gulp.src('docs/*')
.on('data', function() {})
.on('end', function() {
console.log('ending');
done();
});
});
或者,您可以使用finish
事件,它(我认为)会等待,直到所有数据都被推送到流中(即完成工作):
gulp.task('src', function(done) {
gulp.src('docs/*')
.on('finish', function() {
console.log('ending');
done();
});
});
您的第二个gump任务使用gulp.dest('temp')
,它返回一个没有数据的流,因此一旦流完成处理,就会触发end
。
没有答案,但我组装了一个流端模块,以在短期内消除这些怪癖:
end = require('stream-end')
gulp.task 'logger', (done) ->
gulp.src 'docs/*'
.pipe logger()
.pipe end ->
console.log('ending')
done()
无论上游是否流动,都会调用传递给end的回调。