¿Qué tiene de malo?
¡Pero el patrón funciona!
Eres afortunado. Desafortunadamente, probablemente no, ya que es probable que hayas olvidado algunos casos extremos. En más de la mitad de los casos que he visto, el autor se ha olvidado de encargarse del controlador de errores:
return new Promise(function(resolve) {
getOtherPromise().then(function(result) {
resolve(result.property.example);
});
})
Si se rechaza la otra promesa, esto pasará desapercibido en lugar de propagarse a la nueva promesa (donde se manejaría), y la nueva promesa permanece pendiente para siempre, lo que puede provocar fugas.
Lo mismo sucede en el caso de que su código de devolución de llamada provoque un error, por ejemplo, cuando result
no tiene un property
y se produce una excepción. Eso no se manejaría y dejaría la nueva promesa sin resolver.
Por el contrario, el uso se .then()
ocupa automáticamente de estos dos escenarios y rechaza la nueva promesa cuando ocurre un error:
return getOtherPromise().then(function(result) {
return result.property.example;
})
El antipatrón diferido no solo es engorroso, sino también propenso a errores . Usar .then()
para encadenar es mucho más seguro.
¡Pero he manejado todo!
De Verdad? Bueno. Sin embargo, esto será bastante detallado y abundante, especialmente si utiliza una biblioteca prometedora que admita otras funciones como la cancelación o el envío de mensajes. ¿O tal vez lo hará en el futuro, o desea cambiar su biblioteca por una mejor? No querrás volver a escribir tu código para eso.
Los métodos de las bibliotecas ( then
) no solo admiten de forma nativa todas las características, sino que también pueden tener ciertas optimizaciones. Su uso probablemente acelerará su código, o al menos permitirá que se optimice en futuras revisiones de la biblioteca.
¿Cómo lo evito?
Por lo tanto, cada vez que se encuentre creando manualmente una Promise
o una Deferred
promesa existente, consulte primero la API de la biblioteca . El antipatrón diferido a menudo es aplicado por personas que ven las promesas [solo] como un patrón de observación, pero las promesas son más que devoluciones de llamada : se supone que son componibles. Cada biblioteca decente tiene muchas funciones fáciles de usar para la composición de promesas de todas las maneras imaginables, cuidando todas las cosas de bajo nivel con las que no desea lidiar.
Si ha encontrado la necesidad de componer algunas promesas de una nueva manera que no sea compatible con una función auxiliar existente, escribir su propia función con aplazamientos inevitables debería ser su última opción. Considere cambiar a una biblioteca más funcional y / o presente un error en su biblioteca actual. Su responsable de mantenimiento debería poder derivar la composición de las funciones existentes, implementar una nueva función auxiliar para usted y / o ayudar a identificar los casos límite que deben manejarse.
getStuffDone
contenedor de funciones y simplemente usar el literal Promise?