Reutilización de un objeto Promise existente si existe.
Tengo un objeto de diálogo que mostrará, bueno, diálogos. Hay muchos puntos de entrada para mostrar diálogos, por ejemplo, yesNo()
, message()
, confirm()
, etc. Sin embargo, todos estos métodos básicamente llaman al mismo otro método, llamado showSimpleDialog(título, mensaje, botones)
.
Me gustaría que todos estos métodos (incluido showSimpleDialog) devolvieran una promesa, pero hay un problema:
yesNo() {
return new Promise((resolve, reject) => {
axios
.get(......)
.then(this.showSimpleDialog(...));
}
}
Como puedes ver, en el ejemplo anterior, se me impide tanto devolver la promesa que showSimpleDialog haría como pasar la promesa instanciada a showSimpleDialog.
La primera opción es imposible porque ya estamos en una promesa diferente en el momento en que tenemos acceso a ella. La segunda opción no es posible porque el objeto Promise aún no está disponible dentro del constructor. Bueno, técnicamente, en este caso en particular sí lo está (exactamente porque ya estamos en una promesa diferente), pero algunas de mis funciones de entrada son síncronas y otras asíncronas, y simplemente no puedo usar el mismo patrón de código para lograr el mismo efecto en ambos casos.
Investigué al respecto y encontré esto, pero el autor sugiere que este enfoque es defectuoso y arcaico desde el principio.
Entonces, ¿cuál sería el enfoque correcto para devolver una promesa funcional desde TODOS los puntos de entrada, mientras que los puntos de entrada aún pueden reutilizar las promesas entre sí?
davy.ai
Para devolver una Promesa funcional desde todos los puntos de entrada mientras se puede reutilizar las Promesas entre sí, se puede utilizar el método
resolve
del constructor de Promesas.Aquí hay una implementación de ejemplo:
Con esta implementación, todos los puntos de entrada (
siNo()
,mensaje()
,confirmar()
) llaman al métodomostrarDialogo
, que maneja la creación y almacenamiento de una nueva Promesa. Si ya hay una Promesa en progreso, simplemente devuelve la Promesa almacenada.El método
mostrarDialogoSimple
devuelve una nueva Promesa que se resuelve con el resultado deseado. Cuando la Promesa se resuelve,mostrarDialogo
reinicia la Promesa almacenada y resuelve la Promesa devuelta pormostrarDialogo
con el resultado. Si ocurre un error,mostrarDialogo
rechaza la Promesa devuelta pormostrarDialogo
con el error.Este enfoque te permite reutilizar Promesas en todos los puntos de entrada al mismo tiempo que devuelve una Promesa funcional para cada punto de entrada.