Si puedes usar la variable
result, lo que no puedes hacer es usarla en ese momento. De hecho, tu podrías revisar el valor de esa variable desde tu consola y verías los resultados correctos. Sin embargo, al imprimir la variable en esa parte del script, seguirás viendo
undefined.
let result;
setTimeout(_=>result=1, 10000);
console.log(result); //undefined;
Por partes:
let result;
Declaras una variable
result, nada fuera de lo extraordinario.
setTimeout(..., 10000);
Corre una función en 10,000 milisegundos, osea 10 segundos.
_ => result=1
Función que asigna en
result el valor de
1. Está función es llamada 10 segundos después de que se haya agendado.
console.log(result);
Imprime el valor de la variable
result.
¿Cual crees que sea el resultado de
result si la función que asigna el valor a
result no se ejecuta hasta después de 10 segundos? Pues
undefined.
Al final tienes:
1. Declaras variable
2. Agendas una función a ejecutarse 10,000 ms después.
3. Imprimes el valor de la variable.
4. Asignas un valor a la variable 10,000 ms después.
¿Ahora, quizás estés pensando, bueno pero y si la función la hubiese agendado en 0 milisegundos? ¿Se ejecutará inmediatamente ahí?
Y la respuesta es NO.
Esto es por el mecanismo interno con el cual trabajan los entornos de javascript, el ciclo de eventos (Event Loop). Los entornos de javascript corren un determinado código de javascript de inicio a final y una vez terminado la ejecución del código, entran en un ciclo hasta que detecten nuevo código para ejecutar. En este caso la función
setTimeout agenda una función con el entorno de javascript y una vez que nuestro código termine (al imprimir el variable), el entorno de javascript entra en un ciclo y empieza a preguntar si hay algún nuevo evento disponible. Una vez que hayan pasado 10,000 milisegundos el evento se dispara y el entorno es notificado que una función debe correrse.
En pocas palabras.. puedes considerar que las funciones asíncronas ejecutan la función después que el script haya terminado (pero que tan después dependerá de la función asincrona).
Esto es lo mismo con
fetch. Quizás piensas que la respuesta del servidor está en cache y que puede responder inmediatamente pero esto no es así.
El patrón en el cual se intenta guardar en una variable dentro del léxico superior en una llamada a una función asíncrona es por lo general erroneo.