Tengo un objeto Dialog que mostrará, bueno, diálogos. Hay muchos puntos de entrada para mostrar cuadros de diálogo, por ejemplo, yesNo() , message() , confirm() , etc. Sin embargo, todos estos métodos básicamente llaman al mismo otro método, llamado showSimpleDialog(title, message, buttons) .
Me gustaría que todos estos métodos (showSimpleDialog también) devuelvan una promesa, pero hay un inconveniente:
yesNo() { return new Promise((resolve, reject) => { axios .get(......) .then(this.showSimpleDialog(...)); } }Como puede ver, en el ejemplo anterior se me impide devolver la promesa que haría showSimpleDialog o pasar la Promesa instanciada a showSimpleDialog.
Lo primero es imposible porque ya estamos en una Promesa diferente cuando tenemos acceso a ella. Esto último porque el propio objeto Promise aún no está disponible dentro del constructor. Bueno, técnicamente, en este caso particular lo es (exactamente porque ya estamos en una Promesa diferente), pero algunas de mis funciones de entrada son síncronas, algunas asíncronas y simplemente no puedo usar el mismo patrón de código para lograr el mismo efecto. en ambos casos.
Investigué la cosa y encontré esto , pero el autor sugiere que, para empezar, el enfoque es defectuoso y arcaico.
Entonces, ¿cuál sería el enfoque correcto para devolver una Promesa en funcionamiento desde TODOS los puntos de entrada mientras los puntos de entrada aún estarían libres para reutilizar las Promesas de los demás?
Si entiendo correctamente, this.showSimpleDialog(...) también devuelve una Promise , ¿verdad?
Si desea que yesNo() devuelva la Promise devuelta por this.showSimpleDialog(...)
yesNo() { return axios .get(......) .then(()=>{ return this.showSimpleDialog(...); }); } Dicho esto, considere usar async/await , especialmente cuando se trata de múltiples promesas secuenciales, si es posible.
Su código está llamando a this.showSimpleDialog inmediatamente (sincrónicamente) sin esperar a que se resuelva ninguna promesa (la de axios ). Esto se debe a que el código no pasa una función al método then , sino que ejecuta this.showSimpleDialog . Esta ejecución devuelve una promesa (presumiblemente), pero then espera una función como argumento, no una promesa.
Por lo tanto, debe asegurarse de pasar una devolución de llamada a then y dejar que esa devolución de llamada devuelva una promesa. Así se encadenarán las promesas:
.then(() => this.showSimpleDialog(...)); También es importante hacer que la devolución de llamada sea una función de flecha, ya que hará referencia a this , que pretende ser el this en el que se llama a yesNo .