function whilst(test, iteratee, callback) {
    callback = onlyOnce(callback);
    var _fn = wrapAsync(iteratee);
    var _test = wrapAsync(test);
    var results = [];

    function next(err, ...rest) {
        if (err) return callback(err);
        results = rest;
        if (err === false) return;
        _test(check);
    }

    function check(err, truth) {
        if (err) return callback(err);
        if (err === false) return;
        if (!truth) return callback(null, ...results);
        _fn(next);
    }

    return _test(check);
}
function whilst(test, iteratee, callback) {
    callback = onlyOnce(callback);
    var _fn = wrapAsync(iteratee);
    var _test = wrapAsync(test);
    var results = [];

    function next(err, ...rest) {
        if (err) return callback(err);
        results = rest;
        if (err === false) return;
        _test(check);
    }

    function check(err, truth) {
        if (err) return callback(err);
        if (err === false) return;
        if (!truth) return callback(null, ...results);
        _fn(next);
    }

    return _test(check);
}
function whilst ( test , iteratee , callback ) { callback = onlyOnce ( callback ) ; var _fn = wrapAsync ( iteratee ) ; var _test = wrapAsync ( test ) ; var results = [ ] ; function next ( err , ... rest ) { if ( err ) return callback ( err ) ; results = rest ; if ( err === false ) return ; _test ( check ) ; } function check ( err , truth ) { if ( err ) return callback ( err ) ; if ( err === false ) return ; if ( ! truth ) return callback ( null , ... results ) ; _fn ( next ) ; } return _test ( check ) ; }
Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when
stopped, or an error occurs.

@name whilst
@static
@memberOf module:ControlFlow
@method
@category Control Flow
@param {AsyncFunction} test - asynchronous truth test to perform before each
execution of `iteratee`. Invoked with ().
@param {AsyncFunction} iteratee - An async function which is called each time
`test` passes. Invoked with (callback).
@param {Function} [callback] - A callback which is called after the test
function has failed and repeated execution of `iteratee` has stopped. `callback`
will be passed an error and any arguments passed to the final `iteratee`'s
callback. Invoked with (err, [results]);
@returns {Promise} a promise, if no callback is passed
@example

var count = 0;
async.whilst(
function test(cb) { cb(null, count < 5;) },
function iter(callback) {
count++;
setTimeout(function() {
callback(null, count);
}, 1000);
},
function (err, n) {
// 5 seconds have passed, n = 5
}
);
Repeatedly call iteratee while test returns true . Calls callback when stopped or an error occurs .
Whilst test the cache