Skip to content

Instantly share code, notes, and snippets.

@azproduction
Created October 19, 2012 09:41
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 azproduction/3917190 to your computer and use it in GitHub Desktop.
Save azproduction/3917190 to your computer and use it in GitHub Desktop.
var p = Promise();
p.then(function (a) {console.log(a); return Promise().reject(new Error())}, console.error)
.then(console.log, console.error);
p.resolve(false);
var Promise = function () {
var self = this;
if (!(self instanceof Promise)) return new Promise();
self.resolveCallbacks = [];
self.rejectCallbacks = [];
self.done = false;
self.error = null;
self.value = null;
self.chain = null;
};
Promise.prototype.then = function (onResolved, onRejected) {
var self = this;
if (!self.chain) {
self.chain = new Promise();
}
onResolved && self.resolveCallbacks.push(onResolved);
onRejected && self.rejectCallbacks.push(onRejected);
self.fulfill();
return self.chain;
};
Promise.prototype.resolve = function (value) {
var self = this;
if (self.done) return self;
self.done = true;
self.value = value;
return self.fulfill();
};
Promise.prototype.reject = function (error) {
var self = this;
if (self.done) return self;
self.done = true;
self.error = error;
return self.fulfill();
};
Promise.prototype.fulfill = function () {
var self = this;
if (!self.done) {
return self;
}
try {
if (self.error !== null) {
self.rejectCallbacks.forEach(function (error) {
var errorResult = error(self.error);
if (!self.chain.pipeTo(errorResult)) {
self.chain.reject(errorResult);
}
});
} else {
self.resolveCallbacks.forEach(function (ok) {
var okResult = ok(self.value);
if (!self.chain.pipeTo(okResult)) {
self.chain.resolve(okResult);
}
});
}
} catch (e) {
self.chain.reject(e);
}
return this;
};
Promise.prototype.pipeTo = function (promise) {
var self = this;
if (promise instanceof Promise) {
promise.then(function (result) {
self.resolve(result);
}, function (error) {
self.reject(error)
});
return true;
}
return false;
};
var Promise = function () {
var self = this;
if (!(self instanceof Promise)) return new Promise();
self.resolveCallbacks = [];
self.rejectCallbacks = [];
self.resolve = function (value) {return self._resolve(value);};
self.reject = function (error) {return self._reject(error);};
self.done = false;
self.error = null;
self.value = null;
};
Promise.prototype.then = function (onResolved, onRejected) {
var self = this;
onResolved && self.resolveCallbacks.push(onResolved);
onRejected && self.rejectCallbacks.push(onRejected);
self._fulfill();
return self;
};
Promise.prototype._resolve = function (value) {
var self = this;
if (self.done) return self;
self.done = true;
self.value = value;
return self._fulfill();
};
Promise.prototype._reject = function (error) {
var self = this;
if (self.done) return self;
self.done = true;
self.error = error;
return self._fulfill();
};
Promise.prototype._fulfill = function () {
var self = this;
if (!self.done) {
return self;
}
if (self.error !== null) {
self.rejectCallbacks.forEach(function (error) {
error(self.error);
});
} else {
self.resolveCallbacks.forEach(function (ok) {
ok(self.value);
});
}
return this;
};
Promise.prototype.toString = function () {
return "[object Promise]";
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment