Skip to content

Instantly share code, notes, and snippets.

@pablq
Created June 22, 2015 03:11
Show Gist options
  • Save pablq/66588e36d1983e37838a to your computer and use it in GitHub Desktop.
Save pablq/66588e36d1983e37838a to your computer and use it in GitHub Desktop.
practice promise implementation (from http://dailyjs.com/2014/02/20/promises-in-detail/)
module.exports = function(fn) {
var state = "pending";
var value;
var deferred = null;
function resolve(newValue) {
try {
// checks if a newValue is a promise
if (newValue && typeof newValue.then === "function") {
newValue.then(resolve);
return;
}
state = "resolved";
value = newValue;
if (deferred) {
handle(deferred);
}
} catch(e) {
reject(e);
}
}
function reject(reason) {
state = "rejected";
value = reason;
if (deferred) {
handle(deferred);
}
}
function handle(handler) {
if (state === "pending") {
deferred = handler;
return;
}
var handlerCallback;
if (state === "resolved") {
handlerCallback = handler.onResolved;
} else {
handlerCallback = handler.onRejected;
}
if (!handlerCallback) {
if (state === "resolved") {
handler.resolve(value);
} else {
handler.reject(value);
}
return;
}
var ret;
try {
ret = handlerCallback(value);
} catch(e) {
handler.reject(e);
return;
}
handler.resolve(ret);
}
this.then = function (onResolved, onRejected) {
return new Promise(function (resolve, reject) {
handle({
onResolved: onResolved,
onRejected: onRejected,
resolve: resolve,
reject: reject
});
});
};
fn(resolve, reject);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment