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!