diff options
author | Stéphane MBAPE <smbape@yahoo.fr> | 2018-02-14 21:20:35 +0100 |
---|---|---|
committer | Stéphane MBAPE <smbape@yahoo.fr> | 2018-02-14 21:20:35 +0100 |
commit | cd6beba687bec8112357ff72b6a610cf245590cd (patch) | |
tree | 58d631183ac8c4fbc9b7080667f6dd99511f8347 | |
parent | d02807894d9bcf6bff076413e3c7230e7df0f35a (diff) | |
download | async-cd6beba687bec8112357ff72b6a610cf245590cd.tar.gz |
fix "RangeError: Maximum call stack size exceeded"
-rw-r--r-- | lib/internal/eachOfLimit.js | 5 | ||||
-rw-r--r-- | mocha_test/eachOf.js | 12 |
2 files changed, 16 insertions, 1 deletions
diff --git a/lib/internal/eachOfLimit.js b/lib/internal/eachOfLimit.js index da46fa4..0a1f5bc 100644 --- a/lib/internal/eachOfLimit.js +++ b/lib/internal/eachOfLimit.js @@ -15,6 +15,7 @@ export default function _eachOfLimit(limit) { var nextElem = iterator(obj); var done = false; var running = 0; + var looping = false; function iterateeCallback(err, value) { running -= 1; @@ -26,12 +27,13 @@ export default function _eachOfLimit(limit) { done = true; return callback(null); } - else { + else if (!looping) { replenish(); } } function replenish () { + looping = true; while (running < limit && !done) { var elem = nextElem(); if (elem === null) { @@ -44,6 +46,7 @@ export default function _eachOfLimit(limit) { running += 1; iteratee(elem.value, elem.key, onlyOnce(iterateeCallback)); } + looping = false; } replenish(); diff --git a/mocha_test/eachOf.js b/mocha_test/eachOf.js index 925f995..a6c6864 100644 --- a/mocha_test/eachOf.js +++ b/mocha_test/eachOf.js @@ -274,6 +274,18 @@ describe("eachOf", function() { setTimeout(done, 25); }); + it('forEachOfLimit 1024 * 1024 synchronous call', function(done) { + var count = 0; + async.forEachOfLimit(_.range(1024 * 1024), Infinity, function(x, i, callback){ + count++; + callback(); + }, function(err){ + if (err) throw err; + expect(count).to.equal(1024 * 1024); + }); + setTimeout(done, 25); + }); + it('forEachOfLimit error', function(done) { var obj = { a: 1, b: 2, c: 3, d: 4, e: 5 }; var call_order = []; |