2018-06-09 02:25:45 -06:00

44 lines
856 B
JavaScript

// usage:
//
// doWhile(function (next) {
// doAsyncThing(function (err, result) {
// //passing truthy to next() will call this anonymous function again
// //passing falsy to next() will call the done function (if exists)
// return next(result !== 'done');
// });
// }
// , function () {
// return cb()
// }, 3) //concurrency
//
module.exports = function doWhile (fn, done, concurrent) {
var pending = 0;
var end = false;
concurrent = concurrent || 1;
for (var x = 0; x < concurrent; x++) {
run(fn)
}
function run (fn) {
setImmediate(function() {
pending += 1;
fn(function (cont) {
pending -= 1;
if (!cont) {
end = true;
}
if (!end) {
run(fn)
}
else if (end && pending === 0) {
done();
}
})
})
}
};