Skip to content

Instantly share code, notes, and snippets.

@dustinsmith1024
Created May 14, 2014 20:04
Show Gist options
  • Save dustinsmith1024/d4dfd37305ec42f97d71 to your computer and use it in GitHub Desktop.
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/
/** 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