summaryrefslogtreecommitdiff
path: root/lib/waterfall.js
diff options
context:
space:
mode:
authorAlexander Early <alexander.early@gmail.com>2016-03-06 17:33:08 -0800
committerAlexander Early <alexander.early@gmail.com>2016-03-06 17:33:08 -0800
commitd2fe2b323820f4fbce268ade71435d58088118bb (patch)
tree3c38c001df191e66772c5e7fee6042dd0e7beb0a /lib/waterfall.js
parenta201c6e46e5adad8de3dc21a3e5ed998dfa4d9e9 (diff)
downloadasync-d2fe2b323820f4fbce268ade71435d58088118bb.tar.gz
defend against multiple callbacks
Diffstat (limited to 'lib/waterfall.js')
-rw-r--r--lib/waterfall.js34
1 files changed, 19 insertions, 15 deletions
diff --git a/lib/waterfall.js b/lib/waterfall.js
index 8867c87..e25f629 100644
--- a/lib/waterfall.js
+++ b/lib/waterfall.js
@@ -5,28 +5,32 @@ import noop from 'lodash/noop';
import once from 'lodash/once';
import rest from 'lodash/rest';
-import ensureAsync from './ensureAsync';
-import iterator from './iterator';
+import onlyOnce from './internal/onlyOnce';
export default function(tasks, cb) {
cb = once(cb || noop);
if (!isArray(tasks)) return cb(new Error('First argument to waterfall must be an array of functions'));
if (!tasks.length) return cb();
+ var taskIndex = 0;
- function wrapIterator(iterator) {
- return rest(function(err, args) {
+ function nextTask(args) {
+ if (taskIndex === tasks.length) {
+ return cb.apply(null, [null].concat(args));
+ }
+ var task = tasks[taskIndex];
+ taskIndex++;
+
+ var taskCallback = onlyOnce(rest(function(err, args) {
if (err) {
- cb.apply(null, [err].concat(args));
- } else {
- var next = iterator.next();
- if (next) {
- args.push(wrapIterator(next));
- } else {
- args.push(cb);
- }
- ensureAsync(iterator).apply(null, args);
+ return cb.apply(null, [err].concat(args));
}
- });
+ nextTask(args);
+ }));
+
+ args.push(taskCallback);
+
+ task.apply(null, args);
}
- wrapIterator(iterator(tasks))();
+
+ nextTask([]);
}