summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeemu Ikonen <teemu.ikonen@iki.fi>2014-01-11 12:17:39 +0800
committerTeemu Ikonen <teemu.ikonen@iki.fi>2014-01-11 12:17:39 +0800
commitc2b098bb46c9c17bb901a91073dae461dfad7ca8 (patch)
tree9718fea2f35aeb015a3ced803f2bea24f8d56ae5
parentf01b3992fbe7aa2f4881152143608ad666aea1cc (diff)
downloadasync-c2b098bb46c9c17bb901a91073dae461dfad7ca8.tar.gz
Queue calls drain if empty task list is pushed
-rwxr-xr-xlib/async.js8
-rwxr-xr-xtest/test-async.js22
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([]);
+};