2014-10-05 27 views
3

考虑这两个一饮而尽任务:为什么一些Gulp流默认为“流动”,而另一些则不?

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任务中的流是flowing,而源任务中的流不是。

信令的src任务通过调用stream.resume()明确流向:

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 

我已经看到了这个同样的行为的混合使用插件:gulp.destgulp-mocha似乎返回流动的流,而gulp-loggergulp-gh-pages不。

为什么行为上的差异?

回答

2

不是一个答案,为什么,但我扔在一起stream-end模块,以平滑短期内怪癖:

end = require('stream-end') 

gulp.task 'logger', (done) -> 
    gulp.src 'docs/*' 
    .pipe logger() 
    .pipe end -> 
     console.log('ending') 
     done() 

传递给最终的回调被称为上游是否流与否。

2

发生这种情况的原因是因为某些流有数据需要读取,有些则不需要。

gulp.src('docs/*')返回一个可读流,其中包含docs中每个文件的数据。一旦从流中读取所有数据,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(); 
    }); 
}); 

你的第二个一饮而尽任务使用gulp.dest('temp')返回没有数据流,所以end就被触发的STR eam正在完成处理。

相关问题