E.g.
Código
let result; setTimeout(function(){ result = 'algo diferente'; }, 0); console.log(result); //undefined
Pero lo haz puesto en una clase...
Código
class A { metodo(){ setTimeout(_ => this.result = 'algo diferente'); return this.result; } }
Esto simplemente está mal. En el ejemplo, estoy usando setTimeout pero en javascript hay cientos de funciones que son asincronas, sin mencionar las funciones que son compuestas por funciones asincronas y que por ende también son asincronas. En tu caso, tu has usado fetch, pero es el mismo problema.
Una función asíncrona no está obligada a llamar a la función pasada inmediatamente (de hecho, esto casi nunca pasa así). Estas son funciones que agendan la ejecución de una función posteriormente. Es un error creer que la función ha sido llamada antes de la instrucción que asigna el valor (o retorna el valor en tu caso).
Es como si pidieras una pizza y le dejas la instrucción al repartidor que deje la pizza en la puerta. No tratarías de recoger la pizza en la puerta justo después de colgarle a la pizzeria ¿verdad? Pues es lo mismo con javascript. Tu pizza no está hecha, pero la estas intentando poner en la mesa. ¿Pues que has agarrado? Nada, undefined.
Lo correcto es seguir el flujo de ejecución. Si pediste una pizza, tienes que recoger la pizza cuando llegue a tu puerta. Para esto están los mecanismos de promesas, async/await (basados en promesas) y CPS (que está en desuso).
No puedes escapar el flujo de estos mecanismos. Una vez que una función use una función asincrona, tu función pasa también a ser asíncrona.
Esto quiere decir que lo podrías hacer así:
Código
export class DB{ constructor(API){ this.API=API; } show(){ return fetch(this.API) .then(res=>res.json()) } }
O así:
Código
constructor(API){ this.API=API; } async show(){ let res = await fetch(this.API); return res.json(); }
Para luego consumirlo así:
Código
const login=(e)=>{ //... let empleados=new DB(`${API}/empleados/`).show(); empleados.then(data => console.log(data); //... }
Vaya que solo puedes continuar el flujo dentro de la función pasada a then, pues esta agenda la función para que sea ejecutada una vez que el valor exista. En pocas palabras, el metodo then te permite recoger la pizza cuando este en tu puerta.