O que há de errado com isso?
Mas o padrão funciona!
Sortudo. Infelizmente, provavelmente não, pois você provavelmente esqueceu de um caso de ponta. Em mais da metade das ocorrências que vi, o autor esqueceu de cuidar do manipulador de erros:
return new Promise(function(resolve) {
getOtherPromise().then(function(result) {
resolve(result.property.example);
});
})
Se a outra promessa for rejeitada, isso acontecerá despercebido em vez de ser propagado para a nova promessa (onde seria tratada) - e a nova promessa permanecerá pendente para sempre, o que pode induzir vazamentos.
O mesmo acontece no caso em que seu código de retorno de chamada causa um erro - por exemplo, quando result
não há um property
e uma exceção é lançada. Isso não seria tratado e deixaria a nova promessa por resolver.
Por outro lado, o uso .then()
cuida automaticamente desses dois cenários e rejeita a nova promessa quando ocorre um erro:
return getOtherPromise().then(function(result) {
return result.property.example;
})
O antipadrão diferido não é apenas pesado, mas também propenso a erros . Usar .then()
para encadeamento é muito mais seguro.
Mas eu lidei com tudo!
Mesmo? Boa. No entanto, isso será bastante detalhado e abundante, especialmente se você usar uma biblioteca de promessas que suporte outros recursos, como cancelamento ou passagem de mensagens. Ou talvez seja no futuro, ou você queira trocar sua biblioteca por uma melhor? Você não vai querer reescrever seu código para isso.
Os métodos das bibliotecas ( then
) não apenas suportam nativamente todos os recursos, mas também podem ter certas otimizações em vigor. Seu uso provavelmente tornará seu código mais rápido ou, pelo menos, permitirá que seja otimizado por futuras revisões da biblioteca.
Como evito isso?
Assim, sempre que você encontrar-se criar manualmente um Promise
ou Deferred
e promessas já existentes estão envolvidos, verificar a API biblioteca primeiro . O antipadrão diferido é frequentemente aplicado por pessoas que vêem [apenas] promessas como um padrão de observador - mas promessas são mais do que retornos de chamada : elas devem ser compostas. Toda biblioteca decente tem muitas funções fáceis de usar para a composição de promessas de todas as maneiras possíveis, cuidando de todas as coisas de baixo nível com as quais você não deseja lidar.
Se você encontrou a necessidade de redigir algumas promessas de uma maneira nova que não é suportada por uma função auxiliar existente, escrever sua própria função com adiamentos inevitáveis deve ser sua última opção. Considere mudar para uma biblioteca mais abrangente e / ou registrar um bug na sua biblioteca atual. Seu mantenedor deve poder derivar a composição das funções existentes, implementar uma nova função auxiliar para você e / ou ajudar a identificar os casos extremos que precisam ser tratados.
getStuffDone
wrapper da função e apenas usar o literal Promise?