Inside Out Promises.
The simplest, yet handy, resolvable and rejectable Promises for all developers use cases.
// The constructor callback is optional.
// If provided, it's exactly the same
// that you would pass to a new Promise.
const promise = new Esimorp();
// you can already use the instance
// just like any other Promise
promise
.then(console.log)
.catch(console.error);
// ... and whenever it happens ...
promise.resolve('kudos');
- can I
promise.then().resolve()
? Nope, only the initial resolvable creator/owner can resolve it. No side effects at distance. - can I safely pass around a
promise.then()
? Absolutely, that just creates a newPromise
copy that's not resolvable. - how can I abort an operation ? It's up to you, but following there is an example.
function fetchy(url) {
const p = new Esimorp();
const xhr = new XMLHttpRequest();
// derive from Esimorp
// to avoid external resolution
const out = p.then();
// expose only abort, delegating to xhr
out.abort = xhr.abort.bind(xhr);
// resolve indirectly out through Esimorp p
xhr.addEventListener('abort', e => p.reject(e));
xhr.addEventListener('error', e => p.reject(e));
xhr.addEventListener('load', e => p.resolve(xhr));
// perform the operation
xhr.open('get', url);
xhr.send();
// return the Promise with abort delegate
return out;
}
- what else could I do with this ? You could create Promises with a timeout and resolve or reject them before.
const p = new Esimorp((res, rej) => {
// reject in 5 seconds
setTimeout(rej, 5000, 'timeout');
});
// but if resolved or rejected first is OK
setTimeout(() => p.resolve('OK'), 1000);
(C) 2017 Andrea Giammarchi, @WebReflection, MIT Style License.