Skip to content

Instantly share code, notes, and snippets.

@coolaj86
Created March 26, 2010 23:19
Show Gist options
  • Save coolaj86/345517 to your computer and use it in GitHub Desktop.
Save coolaj86/345517 to your computer and use it in GitHub Desktop.
// Douglas Crockford's promise.js
// http://developer.yahoo.com/yui/theater/video.php?v=crockonjs-3
function make_promise() { var status = 'unresolved',
outcome,
waiting = [],
dreading = [];
function vouch(deed, func) {
switch (status) {
case 'unresolved':
(deed === 'fulfilled' ? waiting : dreading).push(func);
break;
case deed:
func(outcome);
break;
}
};
function resolve(deed, value) {
if (status !== 'unresolved') {
throw new Error('The promise has already been resolved:' + status);
}
status = deed;
outcome = value;
(deed == 'fulfilled' ? waiting : dreading).forEach(function (func) {
try {
func(outcome);
} catch (ignore) {}
});
waiting = null;
dreading = null;
};
return {
when: function (func) {
vouch('fulfilled', func);
},
fail: function (func) {
vouch('smashed', func);
},
fulfill: function (value) {
resolve('fulfilled', value);
},
smash: function (string) {
resolve('smashed', string);
},
status: function () {
return status;
}
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment