diff options
author | Graeme Yeates <yeatesgraeme@gmail.com> | 2016-10-15 12:05:09 -0400 |
---|---|---|
committer | Graeme Yeates <yeatesgraeme@gmail.com> | 2016-10-15 12:11:14 -0400 |
commit | 509e3a796fe4689f43206178ff5b899c71e96ed8 (patch) | |
tree | b925a7c4c1fb2a121dac44a56ab51ffc6c8bb6e1 /lib | |
parent | efc6029e0099001c130060fcd9c93ea83f2d727b (diff) | |
download | async-509e3a796fe4689f43206178ff5b899c71e96ed8.tar.gz |
Short circuit loops completely for some,every,detect when ready [fixes #1293]
Diffstat (limited to 'lib')
-rw-r--r-- | lib/internal/breakLoop.js | 3 | ||||
-rw-r--r-- | lib/internal/createTester.js | 24 | ||||
-rw-r--r-- | lib/internal/eachOfLimit.js | 7 |
3 files changed, 18 insertions, 16 deletions
diff --git a/lib/internal/breakLoop.js b/lib/internal/breakLoop.js new file mode 100644 index 0000000..6bb216e --- /dev/null +++ b/lib/internal/breakLoop.js @@ -0,0 +1,3 @@ +// A temporary value used to identify if the loop should be broken. +// See #1064, #1293 +export default {};
\ No newline at end of file diff --git a/lib/internal/createTester.js b/lib/internal/createTester.js index ac38bf7..36223e6 100644 --- a/lib/internal/createTester.js +++ b/lib/internal/createTester.js @@ -1,28 +1,24 @@ 'use strict'; import noop from 'lodash/noop'; +import breakLoop from './breakLoop'; export default function _createTester(eachfn, check, getResult) { return function(arr, limit, iteratee, cb) { - function done(err) { + function done() { if (cb) { - if (err) { - cb(err); - } else { - cb(null, getResult(false)); - } + cb(null, getResult(false)); } } function wrappedIteratee(x, _, callback) { if (!cb) return callback(); iteratee(x, function (err, v) { - if (cb) { - if (err) { - cb(err); - cb = iteratee = false; - } else if (check(v)) { - cb(null, getResult(true, x)); - cb = iteratee = false; - } + // Check cb as another iteratee may have resolved with a + // value or error since we started this iteratee + if (cb && (err || check(v))) { + if (err) cb(err); + else cb(err, getResult(true, x)); + cb = iteratee = false; + return callback(err, breakLoop); } callback(); }); diff --git a/lib/internal/eachOfLimit.js b/lib/internal/eachOfLimit.js index 61fd6a4..da46fa4 100644 --- a/lib/internal/eachOfLimit.js +++ b/lib/internal/eachOfLimit.js @@ -4,6 +4,8 @@ import once from './once'; import iterator from './iterator'; import onlyOnce from './onlyOnce'; +import breakLoop from './breakLoop'; + export default function _eachOfLimit(limit) { return function (obj, iteratee, callback) { callback = once(callback || noop); @@ -14,13 +16,14 @@ export default function _eachOfLimit(limit) { var done = false; var running = 0; - function iterateeCallback(err) { + function iterateeCallback(err, value) { running -= 1; if (err) { done = true; callback(err); } - else if (done && running <= 0) { + else if (value === breakLoop || (done && running <= 0)) { + done = true; return callback(null); } else { |