Last active
January 31, 2017 16:50
-
-
Save thinker3197/6fde66d864fbd216a2db83e2702568d9 to your computer and use it in GitHub Desktop.
A basic implementation of promises in javascript, covers Promise/A+ specification
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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