Skip to content

Instantly share code, notes, and snippets.

@joladev
Last active December 21, 2015 03:19
Show Gist options
  • Save joladev/6241310 to your computer and use it in GitHub Desktop.
Save joladev/6241310 to your computer and use it in GitHub Desktop.
var defer = function () {
var value,
resolution,
handlers = {};
var fulfill = function () {
if (resolution) {
var handler = handlers[resolution];
if (handler) {
handler();
}
}
};
var wrap = function (c, d) {
return function () {
c = c || function () {};
if (resolution === 'rejected') {
c(value);
return d.reject(value);
}
var next;
try {
next = c(value);
}
catch (e) {
return d.reject(e);
}
if (next) {
if (next.then) {
return next.then(function (resp) {
return d.resolve(resp);
}, function (err) {
return d.reject(err);
});
}
}
return d.resolve(next);
};
};
var resolve = function (v) {
value = v;
resolution = 'resolved';
fulfill();
return this;
};
var reject = function (v) {
value = v;
resolution = 'rejected';
fulfill();
return this;
};
var then = function (done, fail) {
var deferred = defer();
handlers.resolved = wrap(done, deferred);
handlers.rejected = wrap(fail, deferred);
fulfill();
return deferred.promise;
};
var promise = {
then: then
};
return {
promise: promise,
then: then,
resolve: resolve,
reject: reject
};
};
@roobie
Copy link

roobie commented Aug 19, 2013

nice :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment