Skip to content

Instantly share code, notes, and snippets.

@filippomangione
Created June 1, 2014 17:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save filippomangione/d891682798c7526164b7 to your computer and use it in GitHub Desktop.
Save filippomangione/d891682798c7526164b7 to your computer and use it in GitHub Desktop.
A simple promise implementation that meets the Promises/A+ spec.
function cbSucc(val) {
console.log("Got my value! Yay!", val);
}
function cbErr(val) {
console.log("D'oh!", val);
}
var defer = function () {
var state = 'pending';
var deferred;
var value;
var handle = function (handler) {
if(state === 'pending') {
deferred = handler;
return;
}
if(state === 'resolved') {
handler.onResolved(value);
} else {
handler.onRejected(value);
}
};
return {
resolve: function (_value) {
if(state === 'resolved') {
throw new Error("A promise can only be resolved once.");
}
value = _value;
state = 'resolved';
if(deferred) {
handle(deferred);
}
},
reject: function (reason) {
value = reason;
state = 'rejected';
if(deferred) {
handle(deferred);
}
},
then: function (onResolved, onRejected) {
handle({
onResolved: onResolved,
onRejected: onRejected
});
}
}
};
var oneSecondLater = function () {
var result = defer();
setTimeout(function () {
if (Math.random() < .5) {
result.resolve(1);
} else {
result.reject("Can't provide one.");
}
}, 1000);
return result;
};
oneSecondLater().then(cbSucc,cbErr);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment