es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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:

    aMethod(): Observable {
      return new Observable((observer) => {
        this.confirmationService.confirm({
          message: 'Una pregunta',
          accept: () => {
            super.aMethod().subscribe({
              next: (valor) => observer.next(valor),
              error: (error) => observer.error(error),
              complete: () => observer.complete(),
            });
          },
        });
      });
    }
    

    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 y complete, 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ón accept. Cuando el usuario acepta la confirmación, llamamos a super.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.

Comments are closed.