Skip to content

Instantly share code, notes, and snippets.

@dmi3y
Last active December 24, 2015 08:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dmi3y/6771024 to your computer and use it in GitHub Desktop.
Save dmi3y/6771024 to your computer and use it in GitHub Desktop.
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