结束正在进行的Gulp流的正确方法是什么?

时间:2015-10-16 19:02:38

标签: node.js gulp gulp-watch node.js-stream

我正在将Grunt构建任务转换为Gulp实现。我正在使用gulp-watch,这就是我为编写任务而编造的内容:

gulp.task('task', function(){
    return watch('glob/**/*', function(){
        var stream = doTask();
        return stream;
    })
});

问题是,如果更改了许多文件,则任务运行次数过多。我需要找到一种去除输入的方法,并取消在新的更改进入时已经启动的任何任务。

如何取消Node.JS / Gulp流?我还没有找到关于此的好文档。我目前正在尝试.end(),但我无法保证Gulp任务(SASS,Autoprefixer和CleanCSS)会尊重这一点。

2 个答案:

答案 0 :(得分:1)

似乎gulp watch debounce和interval选项只处理特定文件,即如果同一文件被更改,则防止重复调用。我找到的解决方案是使用和外部lodash debounce:

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) ms)无论传入的事件如何。

答案 1 :(得分:0)

我最终做的是制作一个小类来缓冲流

https://gist.github.com/bryanerayner/cc2bb9b4da243d94f0f8

gulp文件:

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'
    ]
));

我对此并不完全满意,但它确实有效。如果有人有更合适的节点方式,那么我全都是耳朵。