diff options
Diffstat (limited to 'lib/doDuring.js')
-rw-r--r-- | lib/doDuring.js | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/lib/doDuring.js b/lib/doDuring.js index d12d668..c536f30 100644 --- a/lib/doDuring.js +++ b/lib/doDuring.js @@ -1,4 +1,6 @@ -import during from './during'; +import noop from 'lodash/noop'; +import rest from 'lodash/rest'; +import onlyOnce from './internal/onlyOnce'; /** * The post-check version of [`during`]{@link module:ControlFlow.during}. To reflect the difference in @@ -15,17 +17,28 @@ import during from './during'; * The function is passed a `callback(err)`, which must be called once it has * completed with an optional `err` argument. Invoked with (callback). * @param {Function} test - asynchronous truth test to perform before each - * execution of `fn`. Invoked with (callback). + * execution of `fn`. Invoked with (...args, callback), where `...args` are the + * non-error args from the previous callback of `fn`. * @param {Function} [callback] - A callback which is called after the test * function has failed and repeated execution of `fn` has stopped. `callback` - * will be passed an error and any arguments passed to the final `fn`'s - * callback. Invoked with (err, [results]); + * will be passed an error if one occured, otherwise `null`. */ export default function doDuring(fn, test, callback) { - var calls = 0; + callback = onlyOnce(callback || noop); + + var next = rest(function(err, args) { + if (err) return callback(err); + args.push(check); + test.apply(this, args); + }); + + function check(err, truth) { + if (err) return callback(err); + if (!truth) return callback(null); + fn(next); + } + + check(null, true); - during(function(next) { - if (calls++ < 1) return next(null, true); - test.apply(this, arguments); - }, fn, callback); } + |