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!