2015-10-16 93 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的方式做到這一點,我耳熟能詳。

相關問題