Promessas foram um acréscimo incrível ao JavaScript; elas nos poupam do inferno do callback, tornam a codificação assíncrona mais fácil de manter e nos permitem acompanhar vários processos assíncronos ao mesmo tempo. Promise.all vem à mente, permitindo-nos reagir quando várias promessas são resolvidas. Infelizmente, o Promise.all só resolve quando todas as promessas são resolvidas, portanto, se alguma das promessas falhar, o catch é chamado em vez do then:
Promise.all([
Promise.resolve(1),
Promise.reject(0)
])
.then(() => { console.log('resolved!'); })
.catch(() => { console.log('failed!') });
// >> failed!
Isso é um problema se o senhor quiser que a mesma funcionalidade seja executada independentemente de qualquer promessa no array ser rejeitada. O senhor poderia fornecer a mesma função para then e para catch mas isso pode levar a problemas de manutenção e comentários ocasionais do tipo “WTF IS THIS?!” de outros engenheiros.
Então, o que devemos fazer quando queremos Promise.all acione a funcionalidade independentemente de quaisquer rejeições? Jake Archibald tem a resposta:
Promise.all(promises.map(p => p.catch(() => undefined)));
A promessa de cada catch callback de cada promessa retorna undefined o que permite que a falha da promessa seja tratada como sucesso. Para provar que isso funciona, considere este trecho:
Promise.all([
// Resolves
Promise.resolve(1),
// Rejects after 2 seconds
new Promise((resolve, reject) => setTimeout(() => reject(1), 2000))
].map(p => p.catch(() => undefined))).then(() => console.log('done!'));
// >> done!
Apesar de a segunda promessa ter sido rejeitada, o Promise.all then é chamado! No futuro, poderemos usar o Promise.prototype.finally para lidar mais facilmente com o sucesso e o fracasso.
Obrigado ao Jake por esse truque incrível!
Contadores CSS
Contadores. Eles eram um elemento básico do Geocities/da cena inicial da Web, com os quais muitos de nós, desenvolvedores “mais antigos”, crescemos; um recurso na época, o alvo de piadas na Web agora. O CSS implementou seu próprio tipo de contador, um mais sensato e direto do que o antigo…

