Promessas mudaram o cenário do JavaScript. Muitas APIs antigas foram reencarnadas para usar Promessas (XHR para fetch, API da bateria), enquanto as novas APIs tendem a usar Promises. Os desenvolvedores podem usar async/await para lidar com promessas, ou then/catch/finally com retornos de chamada, mas o que as Promessas não informam ao senhor é o status delas. Não seria ótimo se o Promise.prototype fornecesse aos desenvolvedores um status para saber se uma promessa foi rejeitada, resolvida ou simplesmente concluída?

Minha pesquisa me levou a esta essência que achei bastante inteligente. Reservei algum tempo para modificar um pouco do código e adicionar comentários. A solução a seguir fornece métodos auxiliares para determinar o status de uma 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)]);
}

Alguns exemplos de uso:

// 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

Os desenvolvedores sempre podem adicionar outro await ou then O senhor pode usar uma Promise para executar algo, mas é interessante descobrir o status de uma determinada Promise. Existe alguma maneira mais fácil de saber o status de uma Promise? O senhor pode me informar!