Si suponemos algo como esto en una página web:

<script>
  var yolo;
</script>

<script src="first.js"></script>
<script src="second.js"></script>

En first.js:

async function setvalue() {
   while (true) {
     yolo = Math.random();
   }
}
setvalue();

En second.js:

async function printvalue() {
   while (true) {
     var rdmnumber = yolo;
     console.log(rdmnumber);
   }
}
printvalue()

Sé que en muchos idiomas hacer algo como esto (o con hilo) es peligroso; ¿Qué pasa con javascript? ¿Cuál es la mejor práctica?

-3
KasaiJo 6 feb. 2020 a las 13:57

2 respuestas

La mejor respuesta

Para usar una variable que se puede escribir o leer potencialmente en el mismo momento

Esa no es una situación que pueda tener en JS.

Sé que en muchos idiomas hacer algo como esto (o con hilo) es peligroso; ¿Qué pasa con javascript?

Las funciones asincrónicas no son hilos.

Las funciones asíncronas no hacen que el código de bloqueo no sea de bloqueo. printvalue nunca recibe una llamada porque setvalue nunca termina.

Si setvalue alguna vez se durmiera (porque golpeó un await y esperó una promesa) entonces printvalue se ejecutaría ... pero nunca tocaría yolo al mismo tiempo como setvalue porque setvalue estaría dormido.

El bucle de eventos JS solo hará una cosa a la vez.

Lo peor que obtendrá es una condición de carrera en la que se accede a la variable en un orden inesperado.

Incluso si utilizara trabajadores web, no tendrían acceso a las variables de cada uno. Solo pueden enviar y recibir mensajes.

3
Quentin 6 feb. 2020 a las 11:20

Su código nunca pasará setvalue, ya que nunca terminará. Si quieres hacer algo como esto, escribe tus funciones así:

async function setvalue() {

   yolo = Math.random();
   setTimeout(setvalue);

}
async function printvalue() {

   var rdmnumber = yolo;
   console.log(rdmnumber);
   setTimeout(printvalue);

}

Esto asegurará que sus funciones no bloqueen el bucle de eventos.

1
Łukasz Karczewski 6 feb. 2020 a las 11:13