Created
May 14, 2014 20:04
-
-
Save dustinsmith1024/d4dfd37305ec42f97d71 to your computer and use it in GitHub Desktop.
30 days of code promise implementation from http://mattgreer.org/articles/promises-in-wicked-detail/
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
/** 30_days_of_code | |
* Playing with promise implementations | |
* | |
* used doc here to step by step build: http://mattgreer.org/articles/promises-in-wicked-detail/ | |
*/ | |
function Promise(fn) { | |
var state = 'pending'; | |
var value; | |
var deferred = null; | |
function resolve(newValue){ | |
try { | |
//only looking for .then method not our own Promise implementation | |
//helps if you are intermingling promise libraries | |
if(newValue && typeof newValue.then === 'function'){ | |
newValue.then(resolve, reject); | |
return; | |
} | |
value = newValue; | |
state = 'resolved'; | |
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) { | |
console.warn('caught an unexpected error'); | |
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); | |
} | |
function doSomething() { | |
return new Promise(function(resolve, reject){ | |
var val = Math.floor(Math.random() * (10 - 1 + 1)) + 1; | |
console.log('Original Value:', val) | |
if(val>=6){ | |
console.log('value to high reject!'); | |
reject(val); | |
}else{ | |
resolve(val); | |
} | |
}); | |
} | |
function rejector() { | |
return new Promise(function(resolve, reject){ | |
var val = Math.floor(Math.random() * (10 - 1 + 1)) + 1; | |
reject(val); | |
}); | |
} | |
function nonRejector() { | |
return new Promise(function(resolve, reject){ | |
var val = Math.floor(Math.random() * (10 - 1 + 1)) + 1; | |
resolve(val); | |
}); | |
} | |
function err(err){ | |
console.log(err); | |
} | |
var p = doSomething; | |
var values = []; | |
p() | |
.then(function(val){ | |
values = [val]; | |
console.log('1:', val, values); | |
return val + 22; | |
}, function(err){console.log('error', err)}) | |
.then(function(val){ | |
values.push(val); | |
console.log('2:', val, values); | |
//if we return it promis it will now wait for this | |
//return doSomething(); | |
return val; | |
}, function(err){console.log('error', err)}) | |
.then(function(val){ | |
values.push(val); | |
console.log('3:', val, values); | |
},function(err){console.log('error', err)}); | |
var d = rejector; | |
d().then(function(val){ | |
console.log(val); | |
}, function(err){ | |
console.log('err', err); | |
}) | |
var d = nonRejector; | |
d().then(function(val){ | |
console.log(val); | |
throw err; | |
}, function(err){ | |
console.log('err', err); | |
}) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment