summaryrefslogtreecommitdiff
path: root/lib/doDuring.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/doDuring.js')
-rw-r--r--lib/doDuring.js31
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);
}
+