2015-10-16 35 views
0

我将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)会尊重这一点。

回答

1

看起来好像大嘴的手表反弹和间隔选项将只处理特定的文件,即如果相同的文件被改变,防止重复呼叫。我发现工作的一个解决方案是使用外部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)后,才会调用处理程序。

的几个注意事项:

  1. 列表项 确保您NPM安装,需要lodash。
  2. 在';'结束您的返回语句:-)
  3. 选择一个适当的延迟,以便您的处理程序将进入'饥饿'状态,即从不触发,因为正在进行的事件或包括maxWait选项以确保它在合理的时间后(例如3000毫秒)触发,不管传入的事件。
+0

我很熟悉debounce,并且正在考虑它。我不确定它是否可以在gulp-watch上工作,因为它通常在寻找一个由函数返回的流,我不知道它将如何处理一个虚假的值。我会试一试,谢谢。 –

+0

你的处理程序不带参数,只是触发一个函数。反弹将延迟触发这一行动。它应该工作。如果您在尝试之后添加评论并告诉我们它是否正常工作,我会很高兴。 – Meir

+0

看着这个,基于时间的去抖动不会解决我的问题(除非我可以取消已经开始的流正在进行。) 该任务大约需要10秒才能完成,这意味着文件更改可以开始新的任务不止一次,而它已经在工作。我真的不想一次开始超过一个这样的任务。 我要么停止已经启动的流(然后我可以使用基于时间的去抖动),或者,我需要一个防止事件启动直到任务已完成之后的去抖动。 –

0

我已经结束了做什么,正在小班缓冲流

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的方式做到这一点,我耳熟能详。

相关问题