diff options
author | Teemu Ikonen <teemu.ikonen@iki.fi> | 2014-01-11 12:17:39 +0800 |
---|---|---|
committer | Teemu Ikonen <teemu.ikonen@iki.fi> | 2014-01-11 12:17:39 +0800 |
commit | c2b098bb46c9c17bb901a91073dae461dfad7ca8 (patch) | |
tree | 9718fea2f35aeb015a3ced803f2bea24f8d56ae5 | |
parent | f01b3992fbe7aa2f4881152143608ad666aea1cc (diff) | |
download | async-c2b098bb46c9c17bb901a91073dae461dfad7ca8.tar.gz |
Queue calls drain if empty task list is pushed
-rwxr-xr-x | lib/async.js | 8 | ||||
-rwxr-xr-x | test/test-async.js | 22 |
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/async.js b/lib/async.js index cb6320d..7a4361f 100755 --- a/lib/async.js +++ b/lib/async.js @@ -675,6 +675,14 @@ if(data.constructor !== Array) { data = [data]; } + if(data.length == 0) { + // call drain immediately if there are no tasks + return async.setImmediate(function() { + if (q.drain) { + q.drain(); + } + }); + } _each(data, function(task) { var item = { data: task, diff --git a/test/test-async.js b/test/test-async.js index ff401e7..6bec545 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -2436,3 +2436,25 @@ exports['queue events'] = function(test) { q.push('poo', function () {calls.push('poo cb');}); q.push('moo', function () {calls.push('moo cb');}); }; + +exports['queue empty'] = function(test) { + var calls = []; + var q = async.queue(function(task, cb) { + // nop + calls.push('process ' + task); + async.setImmediate(cb); + }, 3); + + q.drain = function() { + test.ok( + q.length() == 0 && q.running() == 0, + 'queue should be empty now and no more workers should be running' + ); + calls.push('drain'); + test.same(calls, [ + 'drain' + ]); + test.done(); + }; + q.push([]); +}; |