public
Created

  • Download Gist
promise.js
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
// 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;
}
};
};

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.