From 7f54eec0736d28105d5a55a02e233d1a48db0f67 Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Fri, 24 May 2019 11:20:56 -0700 Subject: [PATCH] fix: don't completely flatten arrays pushed to queue/cargo. Fixes #1645 --- lib/internal/queue.js | 22 ++++++++++++++++------ test/queue.js | 20 +++++++++++++++++++- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/lib/internal/queue.js b/lib/internal/queue.js index 0db96a8f4..01567aa5c 100644 --- a/lib/internal/queue.js +++ b/lib/internal/queue.js @@ -50,14 +50,10 @@ export default function queue(worker, concurrency, payload) { throw new Error('task callback must be a function'); } q.started = true; - if (Array.isArray(data)) { - if (data.length === 0 && q.idle()) { - // call drain immediately if there are no tasks - return setImmediate(() => trigger('drain')); - } + /*if (Array.isArray(data)) { return data.map(datum => _insert(datum, insertAtFront, callback)); - } + }*/ var res; @@ -151,6 +147,13 @@ export default function queue(worker, concurrency, payload) { started: false, paused: false, push (data, callback) { + if (Array.isArray(data)) { + if (data.length === 0 && q.idle()) { + // call drain immediately if there are no tasks + return setImmediate(() => trigger('drain')); + } + return data.map(datum => _insert(datum, false, callback)) + } return _insert(data, false, callback); }, kill () { @@ -158,6 +161,13 @@ export default function queue(worker, concurrency, payload) { q._tasks.empty(); }, unshift (data, callback) { + if (Array.isArray(data)) { + if (data.length === 0 && q.idle()) { + // call drain immediately if there are no tasks + return setImmediate(() => trigger('drain')); + } + return data.map(datum => _insert(datum, true, callback)) + } return _insert(data, true, callback); }, remove (testFn) { diff --git a/test/queue.js b/test/queue.js index 5c31116c4..e9f3a787d 100644 --- a/test/queue.js +++ b/test/queue.js @@ -264,6 +264,24 @@ describe('queue', function(){ done(); }); + it('push with arrays', (done) => { + const tasks = [] + var q = async.queue((task, cb) => { + tasks.push(task) + cb() + }, 1); + + q.push([[1, 2, 3], [4, 5, 6]]) + + q.drain(() => { + expect(tasks).to.eql([ + [1, 2, 3], + [4, 5, 6] + ]) + done() + }) + }) + it('unshift', (done) => { var queue_order = []; @@ -607,7 +625,7 @@ describe('queue', function(){ }); expect(q.started).to.equal(false); - q.push([]); + q.push('a'); expect(q.started).to.equal(true); done(); });