结束正在进行的Gulp流的正确方法是什么?
问题描述:
我将Grunt构建任务转换为Gulp实现。我使用gulp-watch
,这就是我炮制运行我的任务:结束正在进行的Gulp流的正确方法是什么?
gulp.task('task', function(){
return watch('glob/**/*', function(){
var stream = doTask();
return stream;
})
});
问题是,如果许多文件被更改,运行任务的次数太多。我需要找到一种方法来消除输入,并取消任何在新更改进入时已启动的任务。
如何取消Node.JS/Gulp流?我一直无法找到关于此的良好文档。我目前正试图.end()
,但我没有保证Gulp任务(SASS,Autoprefixer和CleanCSS)会尊重这一点。
答
看起来好像大嘴的手表反弹和间隔选项将只处理特定的文件,即如果相同的文件被改变,防止重复呼叫。我发现工作的一个解决方案是使用外部lodash去抖:
watch(GLOB_expression, _.decounce(handler, delay));
或具体,你的情况:
gulp.task('task', function(){
return watch('glob/**/*', _.debounce(function(){
var stream = doTask();
return stream;
}, 1000));
});
lodash decounce被默认设置为触发后缘,这意味着只要事件继续进行,它就会等待,并且只有在指定时间段内没有事件(上例中为1000 ms)后,才会调用处理程序。
的几个注意事项:
- 列表项 确保您NPM安装,需要lodash。
- 在';'结束您的返回语句:-)
- 选择一个适当的延迟,以便您的处理程序将进入'饥饿'状态,即从不触发,因为正在进行的事件或包括maxWait选项以确保它在合理的时间后(例如3000毫秒)触发,不管传入的事件。
答
我已经结束了做什么,正在小班缓冲流
https://gist.github.com/bryanerayner/cc2bb9b4da243d94f0f8
的一饮而尽文件:
function setupQuickSassJob(sourceGlob, watchGlob) {
function job() {
function taskFactory() {
return jobs.processSassStyles(
gulp.src([].concat(sourceGlob), { base: '.' }),
'.');
}
gUtil.log('Listening for changes');
var queue = new StreamQueue();
var watchtask = watch([].concat(watchGlob), function (file) {
gUtil.log('Changed: ' + file.path);
return queue.queueTask(taskFactory);
});
return watchtask;
}
return job;
}
gulp.task('desktopSASS', setupQuickSassJob([
'Globs',
],
[
'Globs'
]
));
我不能完全满足于此,但它的工作原理。如果任何人有一个更合适的,Node的方式做到这一点,我耳熟能详。
我很熟悉debounce,并且正在考虑它。我不确定它是否可以在gulp-watch上工作,因为它通常在寻找一个由函数返回的流,我不知道它将如何处理一个虚假的值。我会试一试,谢谢。 –
你的处理程序不带参数,只是触发一个函数。反弹将延迟触发这一行动。它应该工作。如果您在尝试之后添加评论并告诉我们它是否正常工作,我会很高兴。 – Meir
看着这个,基于时间的去抖动不会解决我的问题(除非我可以取消已经开始的流正在进行。) 该任务大约需要10秒才能完成,这意味着文件更改可以开始新的任务不止一次,而它已经在工作。我真的不想一次开始超过一个这样的任务。 我要么停止已经启动的流(然后我可以使用基于时间的去抖动),或者,我需要一个防止事件启动直到任务已完成之后的去抖动。 –