Skip to content

Instantly share code, notes, and snippets.

@thinker3197
Last active January 31, 2017 16:50
Show Gist options
  • Save thinker3197/6fde66d864fbd216a2db83e2702568d9 to your computer and use it in GitHub Desktop.
Save thinker3197/6fde66d864fbd216a2db83e2702568d9 to your computer and use it in GitHub Desktop.
A basic implementation of promises in javascript, covers Promise/A+ specification
function Promise(callback) {
let state = 'pending';
let value;
let deferred = null;
const resolve = function(newValue) {
if(newValue && typeof newValue.then === 'function') {
newValue.then(resolve, reject);
return;
}
state = 'resolved';
value = newValue;
if(deferred)
handle(deferred);
}
const reject = function(reason) {
state = 'rejected';
value = reason;
if(deferred)
handle(deferred);
}
function handle(handler) {
if(state === 'pending') {
deferred = handler;
return;
}
const handlerCallback;
if(state === 'resolved') {
handlerCallback = handler.onResolved;
else
handlerCallback = handler.onRejected;
if(!handlerCallback) {
if(state === 'resolved')
handler.resolve(value);
else
handler.reject(value);
return;
}
const ret = handlerCallback(value);
handler.resolve(ret);
}
this.then = function(onResolved, onRejected) {
return new Promise(function(resolve, reject) {
handle({
onResolved: onResolved,
onRejected: onRejected,
resolve: resolve,
reject: reject
});
});
};
callback(resolve, reject);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment