Promises have changed the JavaScript landscape. Many old APIs have been reincarnated to use Promises (XHR to fetch, Battery API), while new APIs trend towards Promises. Developers can use async
/await
to handle promises, or then
/catch
/finally
with callbacks, but what Promises don’t tell you is their status. Wouldn’t it be great if Promise.prototype
provided developers a status
property to know if a promise is rejected, resolved or just done?
My research led me to this kernel, which I found quite clever. I took the time to change a bit of code and add comments. The following solution provides helper methods for determining the status of a promise:
// Uses setTimeout with Promise to create an arbitrary delay time // In these examples, a 0 millisecond delay is // an instantly resolving promise that we can jude status against async function delay(milliseconds = 0, returnValue) { return new Promise(done => setTimeout((() => done(returnValue)), milliseconds)); } // Promise.race in all of these functions uses delay of 0 to // instantly resolve. If the promise is resolved or rejected, // returning that value will beat the setTimeout in the race async function isResolved(promise) { return await Promise.race([delay(0, false), promise.then(() => true, () => false)]); } async function isRejected(promise) { return await Promise.race([delay(0, false), promise.then(() => false, () => true)]); } async function isFinished(promise) { return await Promise.race([delay(0, false), promise.then(() => true, () => true)]); }
A few examples of use:
// Testing isResolved await isResolved(new Promise(resolve => resolve())); // true await isResolved(new Promise((_, reject) => reject())); // false // Testing isRejected await isRejected(new Promise((_, reject) => reject())); // true // We done yet? await isFinished(new Promise(resolve => resolve())); // true await isFinished(new Promise((_, reject) => reject())); // true
Developers can always add another await
or then
to a promise to perform something, but it is interesting to find out the status of a given promise. Is there an easier way to know the status of a promise? Let me know!