0

Tengo una función async cuyo nombre es conseguirDatos(). En dicha función:

  • Se llaman a dos promesas en orden (van con await)
  • Una vez que terminan las dos promesas precedidas por await() se hace el rerturn. Se supone que dicha función async devuelve una promesa.
   function async conseguirDatos() {
        const nombre = await this.miservicio.getNombre();
        const apellido = await this.miservicio.getApellido();

        return("nombre: " + nombre + " " + "apellido: " + apellido);
   }

Después tengo otra función normal cuyo nombre es llamada que debe retornar un boolean después de comprobar el estado. Esta función por necesidad tiene quye devolverme un boolean (por otros motivos que aquí no expongo), por lo tanto no le puedo poner un async delante. Lo que debe hacer es

 function llamada() {
        this.conseguirDatos().then((valor)=>{
          console.log("mostrando valor: " + valor);

          if(valor!=null){
            return true;

          }else
          {
            return false;
          }

        });

  }

:Mis preguntas son:

-Cómo y dónde debo poner el return dentro de la función llamada : dentro den "then" o fuera? previamente debo asegurarme de que la promesa que me devuelve this.conseguirDatos() se ejecuta ante y se comprueba el valor que me retorna dicha promesa.

Andres Gardiol
  • 1,386
  • 8
  • 16
casiopea2000
  • 173
  • 7
  • 1
    De entrada hay un problema, si `llamada` es una función síncrona entonces al ejecutarse devolverá undefined porque el return que buscas está dentro de una función asíncrona. – Lobos Jul 21 '21 at 00:52
  • 1
    Te recomiendo leer [esta respuesta](https://es.stackoverflow.com/a/1544/54039) para que sepas porqué no puedes devolver el resultado de una promesa y cuál puede ser la alternativa. – Triby Jul 21 '21 at 03:42
  • @Lobos, cuando dices que el **return** está dentro de una función asíncrona te refieres a que está dentro del **then()**? – casiopea2000 Jul 21 '21 at 12:37

1 Answers1

1

Después tengo otra función normal cuyo nombre es llamada que debe retornar un boolean después de comprobar el estado.

Primero que nada hay que tener en claro que la función llamada está ejecutando una función asíncrona.

-Cómo y dónde debo poner el return dentro de la función llamada : dentro den "then" o fuera?

Puedes devolver un booleano tranquilamente en tu función llamada():

function llamada() {
  this.conseguirDatos()
    .then((valor)=>{
     //...
    });
  return true; // o false
}

Ahora bien, si lo que quieres es que el booleano que devuelves sea true o false en base a la respuesta de conseguirDatos(), como es asíncrona, no tienes más opción que manejar la promesa como siempre.

Es decir, devolver la promesa:

function llamada() {
  return this.conseguirDatos()
    .then((valor)=>{
       console.log("mostrando valor: " + valor);
       if(valor!=null){ // acá podrías hacer 'return valor != null' directamente :)
         return true;
       } else {
         return false;
       }
    });
}

Por lo tanto, si bien aclaraste que no quieres esto:

Esta función por necesidad tiene que devolverme un boolean (por otros motivos que aquí no expongo), por lo tanto no le puedo poner un async delante

Tienes que entender que la función llamada depende de una función asíncrona y por eso debes manejarla como se expuso arriba.

Si quieres puedes "exponer" los motivos por el cual necesitas devolver boolean y podríamos tratar de ayudarte a encontrar una solución para tu caso.

Saludos.

Andres Gardiol
  • 1,386
  • 8
  • 16
  • El problema real que quiero resolver no está relacionado con conseguirdatos (era sólo un ejemplo ridículo). Lo que quería hacer es que una función normal de un "guard" en Angular retornase un boolean dependiendo de si otra función (que será asycn) de un servicio comprueba si un usuario está logeado en firebase con **onAuthStateChanged** – casiopea2000 Jul 23 '21 at 00:10
  • 1
    En ese caso lo mejor sería que formules una nueva pregunta con tu problema real, y no con un ejemplo "ridículo". Lo que quieres hacer en realidad es muy común y Angular lo soporta, simplemente tienes que devolver un Observable que se complete, o una Promesa incluso, que resuelvan en `true` o `false`. Fijate en esta pregunta y si no resuelve tu problema crea una nueva y con gusto te ayudaré. https://stackoverflow.com/questions/38425461/angular2-canactivate-calling-async-function – Andres Gardiol Jul 23 '21 at 01:30
  • 1
    Acabo de ver que habias hecho la pregunta aquí https://es.stackoverflow.com/questions/469213/uso-de-async-y-await-en-una-funci%c3%b3n-que-controla-un-guard/470608#470608 y la acabo de responder. Por favor dime si te fue de ayuda. Saludos! – Andres Gardiol Jul 23 '21 at 01:49
  • 1
    Te acabo de contestar en ese hilo. – casiopea2000 Jul 24 '21 at 21:56