为什么有些 Gulp 流默认"flow",而另一些则不然?



考虑这两个吞咽任务:

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的回调。

相关内容

  • 没有找到相关文章

最新更新