A library for manually resolving promises.
I needed callbacks, but I didn't want to end up in a callback hell. I like Promises and this is what I wanted.
new SomeTask(<params>).run().then(val => (...));
// or
const val = await new SomeTask(<params>).run();
Q: ES6 Promises work. Why would anybody want to resolve them manually?
A: When using requestAnimationFrame
, setTimeout
or such you just don't have enough control to put everything in the Promise constructor. Well, you can of course, but I ended up with a messy code. So I built a wrapper around Promises to resolve them manually for this extra bit of flexibility.
import Promissary from 'promissary';
For the love of god, please define a promissary as private. You don't want anybody outside of your task to resolve it, do you?
class SomeTask {
private finished: Promissary<boolean>;
...
}
Initialize it in a public method or a constructor
constructor() {
...
this.finished = new Promissary<boolean>();
...
}
Do the actual asynchronous part in a private method and resolve.
private doTheWork() {
...
// however you're gonna check if it is done
if (this.done()) {
this.finished.resolve(true);
}
// as an example of why you might want to need to resolve the promise manually
requestAnimationFrame(doTheWork.bind(this));
}
Make a public method returning the promise
public run() {
this.doTheWork();
return this.finished.promise;
}
Now you can execute your asynchronous task with then
or await
.
It's written in typescript and the type definitions are included. Tbh, I don't think it's a good idea to use this in vanilla javascript. At least the typescript compiler does enforce private functions.