Sample Promise Implementation. Wrote in https://coderpad.io/626322
// --------------------------------------------- Promise Implementation | |
Promise = function () { | |
this._stack = []; | |
this._isResolved = false; | |
} | |
Promise.prototype = { | |
success: function(callback){ | |
// Is the promise already resolved? | |
if(this._isResolved) { | |
callback( this._result ); | |
} else { | |
this._stack.push(callback); | |
} | |
}, | |
resolve: function(result){ | |
if(this._isResolved) { throw new Error('Promise Has Already Resolved'); } | |
this._result = result; | |
// Clear the promise stack | |
for (var i = 0; i < this._stack.length; i++) { | |
this._stack[i](result); | |
} | |
this._isResolved = true | |
} | |
} | |
// --------------------------------------------- "Assertions" | |
var foo = new Promise(); | |
var bar = new Promise(); | |
foo.resolve('hello'); | |
setTimeout(function(){ | |
bar.resolve('world'); | |
}, 500); | |
foo.success(function(result){ | |
console.log(result); | |
}); | |
bar.success(function(result){ | |
console.log(result); | |
}); | |
// => "hello" | |
// ... 500ms later ... | |
// => "world" | |
//A promise should only be able to be resolved once. Subsequent calls to resolve should error. | |
setTimeout(function(){ | |
bar.resolve('world again'); // Throws error | |
}, 750); | |
//A promise may have multiple success callbacks attatched. | |
setTimeout(function(){ | |
var baz = new Promise(); | |
baz.success(function(result){ console.log(result); }); | |
baz.success(function(result){ console.log(result.split('').reverse().join('')); }); | |
baz.resolve('Rainbow Bunny!'); | |
}, 1000); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment