Skip to content

Instantly share code, notes, and snippets.

@guileen
Created September 11, 2011 10:48
Show Gist options
  • Save guileen/1209448 to your computer and use it in GitHub Desktop.
Save guileen/1209448 to your computer and use it in GitHub Desktop.
A new flow control example, for cross reference
var Trigger = function() {
this.__callbacks = [];
this.__done = [];
};
Trigger.prototype = {
set: function(name) {
var self = this;
return function(err, result) {
if (err)
(self.errors || (self.errors = {}))[name] = err;
else
self[name] = result;
self.__trigger(name);
}
},
on: function() {
var args = Array.prototype.slice.call(arguments);
if (args.length < 2) {
throw 'at least 2 arguments trigger.on("foo","bar",callback)';
}
this.__callbacks.unshift(args);
},
__trigger: function(name) {
this.__done.push(name);
for (var i = this.__callbacks.length - 1; i >= 0; i--) {
var args = this.__callbacks[i],
flag = true;
for (var j = args.length - 2; j >= 0; j--) {
flag = flag && (this.__done.indexOf(args[j]) >= 0);
}
if (flag) {
args[args.length - 1]();
this.__callbacks.splice(i, 1);
}
}
}
};
// test code
function foo(name, time, callback) {
setTimeout(function() {
console.log('ready ' + name);
callback(null, name);
}, time);
}
var trigger = new Trigger();
foo('r0', 10, trigger.set('bar0'));
foo('r1', 20, trigger.set('bar1'));
foo('r2', 30, trigger.set('bar2'));
foo('r3', 40, trigger.set('bar3'));
trigger.on('bar2', 'bar1', function() {
if (trigger.errors) {
} else {
console.log('on bar2,bar1,' + trigger.bar2 + trigger.bar1);
}
});
trigger.on('bar2', 'bar3', function() {
if (trigger.errors) {
} else {
console.log('on bar2,bar3,' + trigger.bar2 + trigger.bar3);
}
});
trigger.on('bar0', 'bar1', function() {
if (trigger.errors) {
} else {
console.log('on bar0,bar1,' + trigger.bar0 + trigger.bar1);
foo(trigger.bar0 + trigger.bar1, 10, trigger.set('bar4'));
}
});
trigger.on('bar0', 'bar2', function() {
if (trigger.errors) {
} else {
console.log('on bar0,bar2,' + trigger.bar0 + trigger.bar2);
}
});
trigger.on('bar2', 'bar4', function() {
if (trigger.errors) {
} else {
console.log('on bar2,bar4,' + trigger.bar2 + trigger.bar4);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment