summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Early <alexander.early@gmail.com>2016-02-27 16:30:40 -0800
committerAlexander Early <alexander.early@gmail.com>2016-02-27 16:30:40 -0800
commit73163c892b1f0f92b03ed47f4379dd0fb649a6a2 (patch)
tree7327872b3f87141a2144c8c3529d4eaeae591082
parent5be644c3c2d913662c24e3fb2fae9f27bf58af21 (diff)
downloadasync-73163c892b1f0f92b03ed47f4379dd0fb649a6a2.tar.gz
make tests pass
-rw-r--r--lib/auto.js52
-rw-r--r--mocha_test/auto.js8
2 files changed, 39 insertions, 21 deletions
diff --git a/lib/auto.js b/lib/auto.js
index 327383b..21fbb08 100644
--- a/lib/auto.js
+++ b/lib/auto.js
@@ -34,13 +34,16 @@ export default function (tasks, concurrency, callback) {
var hasError = false;
var listeners = [];
+
function addListener(fn) {
listeners.unshift(fn);
}
+
function removeListener(fn) {
var idx = indexOf(listeners, fn);
if (idx >= 0) listeners.splice(idx, 1);
}
+
function taskComplete() {
remainingTasks--;
arrayEach(listeners.slice(), function (fn) {
@@ -77,37 +80,52 @@ export default function (tasks, concurrency, callback) {
setImmediate(taskComplete);
}
});
+
var requires = task.slice(0, task.length - 1);
- // prevent dead-locks
- var len = requires.length;
- var dep;
- while (len--) {
- if (!(dep = tasks[requires[len]])) {
- throw new Error('Has non-existent dependency in ' +
- requires.join(', '));
- }
- if (isArray(dep) && indexOf(dep, k) >= 0) {
- throw new Error('Has cyclic dependencies');
+
+ checkForDeadlocks();
+
+ if (ready()) {
+ startNext();
+ } else {
+ addListener(listener);
+ }
+
+ function checkForDeadlocks() {
+ var len = requires.length;
+ var dep;
+ while (len--) {
+ if (!(dep = tasks[requires[len]])) {
+ throw new Error('Has non-existent dependency in ' +
+ requires.join(', '));
+ }
+ if (isArray(dep) && indexOf(dep, k) >= 0) {
+ throw new Error('Has cyclic dependencies');
+ }
}
}
+
function ready() {
return runningTasks < concurrency && !baseHas(results, k) &&
arrayEvery(requires, function (x) {
return baseHas(results, x);
});
}
- if (ready()) {
+
+ function startNext() {
runningTasks++;
- task[task.length - 1](taskCallback, results);
- }
- else {
- addListener(listener);
+ var taskFn = task[task.length - 1];
+ if (requires.length > 0) {
+ taskFn(results, taskCallback);
+ } else {
+ taskFn(taskCallback);
+ }
}
+
function listener() {
if (ready()) {
- runningTasks++;
removeListener(listener);
- task[task.length - 1](taskCallback, results);
+ startNext();
}
}
});
diff --git a/mocha_test/auto.js b/mocha_test/auto.js
index d0141bb..cc80aed 100644
--- a/mocha_test/auto.js
+++ b/mocha_test/auto.js
@@ -263,15 +263,15 @@ describe("auto", function () {
// Issue 462 on github: https://github.com/caolan/async/issues/462
it('auto modifying results causes final callback to run early', function(done) {
async.auto({
- task1: function(callback, results){
- results.inserted = true;
+ task1: function(callback){
callback(null, 'task1');
},
- task2: function(callback){
+ task2: ["task1", function(results, callback){
+ results.inserted = true;
setTimeout(function(){
callback(null, 'task2');
}, 50);
- },
+ }],
task3: function(callback){
setTimeout(function(){
callback(null, 'task3');