UNPKG

2.32 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _onlyOnce = require('./internal/onlyOnce');
8
9var _onlyOnce2 = _interopRequireDefault(_onlyOnce);
10
11var _wrapAsync = require('./internal/wrapAsync');
12
13var _wrapAsync2 = _interopRequireDefault(_wrapAsync);
14
15var _awaitify = require('./internal/awaitify');
16
17var _awaitify2 = _interopRequireDefault(_awaitify);
18
19function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
21/**
22 * Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when
23 * stopped, or an error occurs.
24 *
25 * @name whilst
26 * @static
27 * @memberOf module:ControlFlow
28 * @method
29 * @category Control Flow
30 * @param {AsyncFunction} test - asynchronous truth test to perform before each
31 * execution of `iteratee`. Invoked with ().
32 * @param {AsyncFunction} iteratee - An async function which is called each time
33 * `test` passes. Invoked with (callback).
34 * @param {Function} [callback] - A callback which is called after the test
35 * function has failed and repeated execution of `iteratee` has stopped. `callback`
36 * will be passed an error and any arguments passed to the final `iteratee`'s
37 * callback. Invoked with (err, [results]);
38 * @returns {Promise} a promise, if no callback is passed
39 * @example
40 *
41 * var count = 0;
42 * async.whilst(
43 * function test(cb) { cb(null, count < 5); },
44 * function iter(callback) {
45 * count++;
46 * setTimeout(function() {
47 * callback(null, count);
48 * }, 1000);
49 * },
50 * function (err, n) {
51 * // 5 seconds have passed, n = 5
52 * }
53 * );
54 */
55function whilst(test, iteratee, callback) {
56 callback = (0, _onlyOnce2.default)(callback);
57 var _fn = (0, _wrapAsync2.default)(iteratee);
58 var _test = (0, _wrapAsync2.default)(test);
59 var results = [];
60
61 function next(err, ...rest) {
62 if (err) return callback(err);
63 results = rest;
64 if (err === false) return;
65 _test(check);
66 }
67
68 function check(err, truth) {
69 if (err) return callback(err);
70 if (err === false) return;
71 if (!truth) return callback(null, ...results);
72 _fn(next);
73 }
74
75 return _test(check);
76}
77exports.default = (0, _awaitify2.default)(whilst, 3);
78module.exports = exports['default'];
\No newline at end of file