How to Determine a JavaScript Promise’s Status


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!

Website performance monitoring
Website performance monitoring
William

Leave a Reply

Your email address will not be published. Required fields are marked *