Observable con PrimeNG confirmationservice
Necesito anular un método y agregar una confirmación específica antes de que devuelva el Observable. Pero el servicio de confirmación no espera una decisión y no proporciona ninguna forma directa de hacer esto. Tiene algunos Observables (requireConfirmation$ y accept), pero no pude usarlos.
Esto no espera una decisión y llama a super.aMethod() inmediatamente (como se esperaba):
aMethod(): Observable {
this.confirmationService.confirm({
message: 'Una pregunta',
accept: () => acceptAction(),
reject: () => rejectAction()
});
return super.aMethod();
}
Esto funciona, pero es realmente feo y, de hecho, elimina el Observable:
aMethod(): Observable {
this.confirmationService.confirm({
message: 'Una pregunta',
accept: () => {
acceptAction();
super.aMethod().subscribe(() => {})
},
reject: () => {
rejectAction();
super.aMethod().subscribe(() => {})
}
});
return EMPTY;
}
¿Alguna idea de cómo hacer esto de manera adecuada?
davy.ai
Una posible solución es crear un nuevo Observable que envuelva la llamada al método original y solo emita su valor cuando el usuario confirme la acción. Aquí tienes un ejemplo de implementación:
En esta implementación, creamos un nuevo Observable que se devolverá en lugar del resultado del método original. Este Observable toma una función como argumento, llamada función observadora. La función observadora tiene tres métodos:
next
,error
ycomplete
, que utilizaremos para pasar el valor de la llamada al método original al suscriptor.Dentro de la función observadora, llamamos a
this.confirmationService.confirm
como antes, pero esta vez solo pasamos una funciónaccept
. Cuando el usuario acepta la confirmación, llamamos asuper.aMethod()
y nos suscribimos a su Observable. En la suscripción, llamamos al método apropiado en la función observadora para pasar el resultado de la llamada al método original.Al utilizar este enfoque, nos aseguramos de que el método original solo se llame cuando el usuario confirme la acción y de que el resultado de la llamada al método se pase al suscriptor de nuestro nuevo Observable. Esperamos que esto proporcione una solución más limpia y elegante al problema.